stdio.h
stdio.h (расшифровывается как standard input/output header — стандартный заголовочный файл ввода/вывода) — заголовочный файл стандартной библиотеки языка C, содержащий определения макросов, константы и объявления функций и типов, используемых для различных операций стандартного ввода и вывода. Функциональность унаследована от «портативного пакета ввода/вывода» («portable I/O package»), написанного Майком Леском из Bell Labs в начале 1970-х.
Функции [ ]
- clearerr
- fgetc
- fgets
- fopen
- fputc
- fputs
- fread
- fseek
- ftell
- printf
- scanf
- snprintf
- vfprintf
- vsprintf
- Константы [ ]
- _IOFBF
- _IOLBF
- _IONBF
- L_tmpnam
- SEEK_CUR
- SEEK_END
- SEEK_SET
- Переменные [ ]
- stdin
- Типы данных [ ]
Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA, если не указано иное.
Stdio h c что это
Эта глава описывает функции, которые осуществляют управление файлами и другими потоками ввода-вывода. Среди этих функций есть процедуры, которые генерируют и считывают строки в соответствии с форматом string. Дополнительные возможности ввода-вывода зависят от операционной системы, но эти функции обеспечивают единый интерфейс. Соответствующие описания содержатся в stdio.h. Функции повторного вхождения этих функций используют макросы
_stdin_r(reent) _stdout_r(reent) _stderr_r(reent)
вместо глобальных stdin, stdout и stderr. Аргумент является указателям на данные для повторного вхождения.[reent]>
#include void clearerr(FILE *fp);
Функции stdio заводят индикатор ошибок для каждого файла, на который указывает указатель fp, для записи туда информации об ошибках ввода-вывода, связанных с данным файлом или потоком. Аналогично заводится индикатор конца файла, показывающий, есть ли еще данные в этом файле. Используйте clearerr для сброса этих индикаторов. Используйте ferror и feof для проверки этих индикаторов. clearerr не возвращает никакого результата. Стандарт ANSI требует наличия функции clearerr. Никаких процедур ОС не требуется.
#include int fclose(FILE *fp);
Если определенный fp файл или поток открыт, то fclose закрывает его, предварительно записав все обрабатываемые данные (вызвав fflush(fp)). fclose возвращает 0, если он был выполнен успешно (включая случай, когда fp — NULL или не открытый файл); иначе возвращается EOF. Стандарт ANSI требует наличия функции fclose. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int feof(FILE *fp);
feof проверяет, был ли достигнут конец файла, на который указывает fp. feof возвращает 0, если конец файла еще не был достигнут, и ненулевое значение в противном случае. Стандарт ANSI требует наличия функции feof. Никаких процедур ОС не требуется.
#include int ferror(FILE *fp);
Функции stdio заводят индикатор ошибок для каждого файла, на который указывает указатель fp, для записи туда информации об ошибках ввода-вывода, связанных с данным файлом или потоком. Используйте ferror для выяснения значения этого индикатора. Используйте clearerr для сброса индикатора ошибки. ferror возвращает 0 в случае отсутствия ошибок; в случае отсутствия ошибок возвращается ненулевое значение. Стандарт ANSI требует наличия функции ferror. Никаких процедур ОС не требуется.
#include int fflush(FILE *fp);
Функции вывода stdio могут буферизировать вывод, для минимизации количества лишних системных вызовов. Используйте fflush для завершения вывода из файла или потока, определяемого fp. Если fp равен NULL, fflush заканчивает вывод изо всех открытых файлов. fflush возвращает 0 во всех случаях, кроме тех, когда происходят ошибки записи; в этих случаях возвращается EOF. Стандарт ANSI требует наличия функции fflush. Никаких процедур ОС не требуется.
#include int fgetc(FILE *fp);
Используйте fgetc для считывания следующего знака из файла или потока, определяемого fp. При этом fgetc сдвигает индикатор текущей позиции файла. Для использования макро-версии этой функции смотрите getc. Возвращается следующий знак (читается как unsigned char и преобразовывается в int), если только не заканчиваются данные или операционная система возвращает ошибку чтения; в обоих этих случаях fgetc возвращается EOF. Вы можете различить две ситуации возврата EOF при помощи функций ferror и feof. Стандарт ANSI требует наличия функции fgetc. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int fgetpos(FILE *fp, fpos_t *pos);
Объект типа FILE может иметь «позицию», которая показывает, какая часть файла уже была прочитана программой. Многие функции stdio зависят от этой позиции и многие изменяют ее. Вы можете использовать fgetpos для получения текущей позиции файла, на который указывает fp; fgetpos запишет значение, представляющие эту позицию, в *pos. Позже можно использовать это значение, возвращаясь при помощи fsetpos на эту позицию в файле. В этой реализации fgetpos использует счетчик знаков для представления позиции в файле, это то же самое число, что возвращается ftell. fgetpos возвращает 0 в случае успешного выполнения. Если fgetpos не выполняется, то в результате выдается 1. Ошибка происходит, если поток не поддерживает позиционирования; глобальный errno имеет в этой ситуации значение espipe. Стандарт ANSI требует наличия функции fgetpos, но значения записываемых им величин не специфицированы, за исключением того, что они могут быть переданы в качестве аргументов для fsetpos. В конкретной реализации C ftell может выдавать результаты, отличные от записываемых fgetpos в *pos. Никаких процедур ОС не требуется.
#include char *fgets(char *buf, int n, FILE *fp);
Считывает не более n-1 знак из fp до знака новой строки. Эти знаки, включая знак новой строки, сохраняются в buf. В конце буфера записывается 0. fgets возвращает переданный ей буфер, заполненный данными. Если конец файла встретился, когда какие-то данные уже были собраны, то данные возвращаются без какого-либо обозначения этого. Если никакие данные не были прочитаны, то возвращается NULL. fgets должен заменить все вхождения gets. Отметим, что fgets возвращает все данные, в то время как gets убирает знаки новых строк, не показывая этого. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int fiprintf(FILE *fd, const char *format, . );
fiprintf — ограниченная версия fprintf: она имеет те же аргументы и выполняет те же операции, но не может осуществлять операции с числами с плавающей точкой — спецификации типов `f’, `g’, `g’, `e’ и `f’ не распознаются. fiprintf возвращает число байт в выведенной строке, не считая завершающего NULL. fiprintf заканчивает работу, если встречает конец форматируемой строки. Если встречается ошибка, то fiprintf возвращает EOF. Стандарт ANSI не требует наличия функции fiprintf. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include FILE *fopen(const char *file, const char *mode); FILE *_fopen_r(void *reent, const char *file, const char *mode);
fopen инициализирует структуры данных, необходимых для чтения или записи файла. Имя файла определяется строкой в file, а тип доступа к файлу — строкой в mode. Другая функция _fopen_r является повторно-входимым аналогом. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости. Возможны три основных типа доступа: чтение, запись и добавление. *mode должен начинаться с одного из трех знаков «r», «w» или «a», которые означают следующие: `r’ Открыть файл для чтения; эта операция заканчивается неудачей, если файл не существует или операционная система не разрешает прочитать его. `w’ Откpыть файл для записи с начала, фактически создается новый файл. Если файл с этим именем yже сyществyет, то его содеpжимое пpопадает. `a’ Откpывает файл для добавления данных, то есть дописывания текста в конец файла. Когда Вы откpываете файл таким способом, все данные записываются в текyщий конец файла, использование fseek не может повлиять на это. Некотоpые опеpационные системы pазличают двоичные и текстовые файлы. Такие системы могyт пpеобpазовывать записываемые или считываемые данные из файлов, откpытых как текстовые. Если Ваша система относится к таким, то можно опpеделить файл как двоичный, дописав к pежимy бyквy «b» (по умолчанию файл считается текстовым). «rb», таким образом, означает «чтение двоичного файла»; «wb»- «запись двоичного файла»; «ab» — «дописать двоичный файл». Для большей переносимости программ на c «b» допускается на всех системах, в не зависимости от того, имеет ли это значение. Наконец, может понадобиться возможность как чтения, так и записи файла. Для этого можно добавить «+» к какому-либо из трех режимов. (Если добавляются и «b» и «+», то это можно делать в любом порядке: например: «rb+» эквивалентно «r+b» при использовании в качестве строки задания режима.) Использование «r+» (или «rb+») позволяет читать и записывать в любом месте существующего файла, не уничтожая данных; «w+» (или «wb+») создает новый файл (или стиpает все данные из стаpого), что позволяет читать и записывать в любом месте этого файла; «a+» (или «ab+») позволяет считывать любое место файла, но записывать — только в конец. fopen возвращает указатель на файл, который Вы можете использовать в других операциях с файлом, если только запрашиваемый файл может быть открыт, в этом случае выдается NULL. Если причиной ошибки была неправильная строка mode, то errno устанавливается в EINVAL. Стандарт ANSI требует наличия функции fopen. Требуются процедуры ОС: close, fstat, isatty, lseek, open, read, sbrk, write.
#include FILE *fdopen(int fd, const char *mode); FILE *_fdopen_r(void *reent, int fd, const char *mode);
fdopen получает дескриптор файла типа file * из дескриптора уже открытого файла (получаемого, например, системной процедурой `open’ или, реже, при помощи fopen). Аргумент mode имеет тоже значение, что и в fopen. Возвращается указатель на файл или NULL, как и для fopen. Стандарт ANSI требует наличия функции fdopen.
#include int fputc(int ch, FILE *fp);
fputc преобразовывает аргумент ch из int в unsigned char, а затем записывает это в файл или поток, определяемый fp. Если файл был откpыт в pежиме добавления (или поток не поддеpживает позициониpования), то новый знак записывается в конец файла или потока. В дpyгих слyчаях новый знак записывается в соответствии с индикатоpом текyщей позиции в файле, котоpый yвеличивается на один. Для использования макро-версии этой функции смотрите putc. В случае успешного выполнения fputc возвращает аргумент ch. В случае ошибки выдается EOF. Выяснить тип ошибки можно при помощи ferror(fp). Стандарт ANSI требует наличия функции fputc. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int fputs(const char *s, FILE *fp);
fputs записывает строку s (без завершающего NULL) в файл или поток, определенный fp. В случае успешного выполнения выдается 0; в противном случае выдается EOF. Стандарт ANSI требует наличия функции fputs, но не требует выдачи 0 в случае успешного выполнения, допустимо любое неотрицательное значение. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include size_t fread(void *buf, size_t size, size_t count, FILE *fp);
fread пытается скопировать из файла или потока, определенного fp, count элементов (каждый размера size) в память, начиная с buf. fread может скопировать меньше count элементов в случае ошибки или конца файла. fread также увеличивает индикатор позиции в файле на число реально считанных знаков. В результате fread выдает количество успешно прочитанных элементов. Стандарт ANSI требует наличия функции fread. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include FILE *freopen(const char *file, const char *mode, FILE *fp);
Этот вариант fopen позволяет определять для файла особенные дескрипторы fp (например stdin, stdout или stderr). Если fp был связан с другим файлом или потоком, freopen закрывает это файл или поток (но игнорирует при этом все ошибки). file и mode имеют то же значение, что и для fopen. В случае успешного выполнения выдается аргумент fp. Если указанный файл не может быть открыт, то выдается NULL. Стандарт ANSI требует наличия функции freopen. Требуются процедуры ОС: close, fstat, isatty, lseek, open, read, sbrk, write.
#include int fseek(FILE *fp, long offset, int whence)
Объект типа FILE может иметь «позицию», которая показывает, какая часть файла уже была прочитана программой. Многие функции stdio зависят от этой позиции и многие изменяют ее. Вы можете использовать fseek для перехода на позицию в файле fp. Значение offset определяет новую позицию, одним из трех способов определяемую значением whence (определяется как макрос в stdio.h): seek_set offset указывает на абсолютное место в файле (смещение относительно начала файла). offset должен быть положительным. seek_cur offset указывает смещение относительно текущей позиции. offset может принимать как положительные, так и отрицательные значения. seek_end offset указывает смещение относительно конца файла. offset может быть как положительным (что увеличивает размер файла), так и отрицательным. Смотрите ftell для определения текущей позиции. fseek возвращает 0 в случае успешного выполнения. В противном случае возвращается EOF. Причина ошибки обозначается в errno значениями espipe (поток, на который указывает fp не поддерживает перемену позиции) и einval (неправильная позиция в файле). Стандарт ANSI требует наличия функции fseek. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int fsetpos(FILE *fp, const fpos_t *pos);
Объект типа FILE может иметь «позицию», которая показывает, какая часть файла уже была прочитана программой. Многие функции stdio зависят от этой позиции и многие изменяют ее. fsetpos преобразовывает текущую позицию в файле, указанном fp, на предыдущую позицию *pos (которая была получена при помощи fgetpos). Процедура fseek делает примерно тоже. fgetpos возвращает 0 в случае успешного выполнения. В противном случае fgetpos возвращает 1. Причина ошибки обозначается в errno значениями espipe (поток, на который указывает fp не поддерживает перемену позиции) и einval (неправильная позиция в файле). Стандарт ANSI требует наличия функции fsetpos, но не определяет структуру *pos кроме ее соответствия выдаваемым fgetpos результатам. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include long ftell(FILE *fp);
Объект типа FILE может иметь «позицию», которая показывает, какая часть файла уже была прочитана программой. Многие функции stdio зависят от этой позиции и многие изменяют ее. В результате ftell выдает текущую позицию в файле, указанном fp. Сохраненный результат может потом использоваться с fseek для возвращения на эту позицию. В данной реализации ftell просто использует счетчик знаков для представления позиции в файле; это то же число, что будет выдано fgetpos. ftell возвращает позицию в файле, если это возможно. В противном случае возвращается -1l. Ошибка происходит, если поток не поддерживает позиционирование; глобальный errno обозначает эту ситуацию при помощи значения espipe. Стандарт ANSI требует наличия функции ftell, но значение ее результата (в случае успешного выполнения) не специфицировано, кроме требования соответствия формату аргумента fseek. В некоторых реализациях c ftell может возвращать результат, отличный от записываемого fgetpos. Никаких процедур ОС не требуется.
#include size_t fwrite(const void *buf, size_t size, size_t count, FILE *fp);
fwrite пытается скопировать, начиная с buf, count элементов (каждый pазмеpа size) в файл или поток, указанный fp. fwrite может скопировать меньше count элементов в случае ошибки. fwrite также сдвигает вперед индикатор позиции в файле (если он есть) на число реально записанных знаков. Если fwrite выполняется успешно, то выдается аргумент count. В других случаях выдается число элементов, полностью скопированных в файл. Стандарт ANSI требует наличия функции fwrite. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int getc(FILE *fp);
getc — это макро, определенное в stdio.h. getc считывает следующий знак из файла или потока, определенного fp. getc сдвигает индикатор текущей позиции. Для использования подпрограммы вместо макро смотрите fgetc. Выдается следующий знак (читается как unsigned char и преобразовывается в int), если только не заканчиваются данные или операционная система сообщает об ошибке чтения; в обоих случаях getc возвращает EOF. Эти ситуации можно различить используя функции ferror и feof. Стандарт ANSI требует наличия функции getc; он предполагает, но не требует, чтобы функция getc была введена как макро. Реализация getc как макро может использовать один и тот же аргумент несколько раз; однако в переносимых программах лучше не использовать выражения, вызывающие побочные эффекты, как аргументы getc. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int getchar(void); int _getchar_r(void *reent);
getchar — это макро, определенное в stdio.h. getchar считывает следующий знак из стандартного входного потока, определенного fp. getchar сдвигает индикатор текущей позиции. Другая функция _getchar_r является повторно-входимым аналогом. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости. Выдается следующий знак (читается как unsigned char и преобразовывается в int), если только не кончились данные или операционная система сообщает об ошибке чтения; в обоих случаях getchar возвращает EOF. Эти ситуации можно различить при помощи ferror(stdin) и feof(stdin). Стандарт ANSI требует наличия функции getchar; он предполагает, но не требует, чтобы функция getchar была введена как макро. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include char *gets(char *buf); char *_gets_r(void *reent, char *buf);
Считывает знаки из стандартного ввода до знака новой строки. Знаки до новой строки сохраняются в buf. Знак новой строки опускается, а буфер заканчивается 0. Это опасная функция, так как нет способа проверить наличие места в buf. Один из способов атаки internet worm в 1988 использовал это для переполнения буфера в стеке finger-демона и перезаписывал адрес возврата, вызывая выполнение демоном полученного после соединения кода. Другая функция _gets_r является повторно-входимым аналогом. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости. gets возвращает переданный буфер, заполненный данными. Если конец файла встречается в момент, когда некоторые данные уже записаны, то данные возвращаются без каких-либо признаков этого. Если конец файла встретился пи пустом буфере, то возвращается NULL. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int iprintf(const char *format, . );
iprintf — ограниченная версия printf: она имеет те же аргументы и выполняет те же операции, но не может осуществлять операции с числами с плавающей точкой — спецификации типов `f’, `g’, `g’, `e’ и `f’ не распознаются. iprintf возвращает число байт в выведенной строке, не считая завершающего NULL. iprintf заканчивает работу, если встречает конец форматируемой строки. Если встречается ошибка, то iprintf возвращает EOF. Стандарт ANSI не требует наличия функции iprintf. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include char *mktemp(char *path); int mkstemp(char *path); char *_mktemp_r(void *reent, char *path); int *_mkstemp_r(void *reent, char *path);
mktemp и mkstemp пытаются создать имя, не используемое для существующего файла. mkstemp создает файл и открывает его для чтения и для записи; mktemp просто выдает имя файла. Строка path задает начало имени файла. Она должна быть пpавильным именем файла (возможно включающим пyть), заканчивающимся на несколько знаков «x». Созданное имя бyдет начинаться на этy стpокy, а оставшиеся «x» бyдyт заменены какой-либо комбинацией цифp и бyкв. Другие функции _mktemp_r и _mkstemp_r являются повторно-входимыми аналогами. Дополнительный аргумент reent является указателем на структуру, содержащую информацию для обеспечения повторной входимости. mktemp возвращает указатель path на модифицированную строку, представляющую не используемое имя файла, если оно было сгенерировано, в противном случае возвращается NULL. mkstemp возвращает дескриптор нового созданного файла, если возможно сгенерировать имя несуществующего файла, в противном случае возвращается -1. Стандарт ANSI C не требует ни mktemp, ни mkstemp; System V Interface Definition (определение интерфейса System V) издание 2 требует наличие mktemp. Требуются процедуры ОС: getpid, open, stat.
#include void perror(char *prefix); void _perror_r(void *reent, char *prefix);
perror печатает (в стандартный поток ошибок) сообщение об ошибке, соответствующее текущему значению глобальной переменной errno. Если NULL не передан как значение аргумента prefix, то сообщение об ошибке будет записано в строку, начинающуюся в prefix, которая будет оканчиваться двоеточием и пробелом (`: ‘). Остальная часть сообщения об ошибке — одна из строк, описанных для strerror. Другая функция _perror_r является повторно-входимым аналогом. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости. perror не возвращает никакого результата. Стандарт ANSI требует наличия функции perror, но выводимые строки отличаются в зависимости от реализации. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int putc(int ch, FILE *fp);
putc — это макро, определенное в stdio.h. putc записывает аргумент ch в файл или поток, определенный fp, после преобразования его из int в unsigned char. Если файл был открыт в режиме добавления (или поток не поддерживает позиционирования), то новый знак записывается в конец файла или потока. в противном случае новый знак записывается в соответствии с текущим значением индикатора позиции, который увеличивается при этом на один. Реализацию этого макро как процедуры смотрите в fputc. В случае успешного выполнения putc возвращает свой аргумент ch. В случае ошибки выдается EOF. Для определения наличия ошибок можно использовать ferror(fp). Стандарт ANSI требует наличия функции putc; это предполагает, но не требует, putc был реализован как макро. Стандарт разрешает макро-реализациям putc использовать аргумент fp более одного раза; тем не менее, для переносимых программ, не следует использовать выражения, выполняющие какие-либо дpyгие действия, в качестве этого аргумента. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int putchar(int ch); int _putchar_r(void *reent, int ch);
putchar — это макро, определенное в stdio.h. putchar записывает свой аргумент в стандартный поток вывода, после преобразования из int в unsigned char. Другая функция _putchar_r является повторно-входимым аналогом. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости. В случае успешного выполнения putchar возвращает свой аргумент ch. В случае ошибки выдается EOF. Для определения наличия ошибок можно использовать ferror(stdin). Стандарт ANSI требует наличия функции putchar; при этом предполагается, но не требуется, чтобы putchar был реализован как макро. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int puts(const char *s); int _puts_r(void *reent, const char *s);
puts записывает строку в s (которая оканчивается знаком новой строки, вместо NULL) в стандартный выходной поток. Другая функция _puts_r является повторно-входимым аналогом. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости. В случае успешного выполнения выдается 0; в противном случае выдается EOF. Стандарт ANSI требует наличия функции puts, но не определяет, что в случае успеха результат должен быть нулем, допускается любое неотрицательное значение. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int remove(char *filename); int _remove_r(void *reent, char *filename);
remove уничтожает связь с указанным в строке filename именем файла и представляемым ею файлом. Использовав remove с конкpетным именем файла, впоследствии нельзя откpыть файл с этим именем. В этой pеализации remove можно использовать для откpытого файла и это не бyдет ошибкой; каждый сyществyющий дескриптор бyдет пpодолжать иметь достyп к данным этого файла, до тех поp, пока использyющая его пpогpамма не закpоет этот файл. Другая функция _remove_r является повторно-входимым аналогом. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости. remove возвращает 0 в случае успешного выполнения и -1 в противном случае. Стандарт ANSI требует наличия функции remove, но определяет только ненулевой результат в случае ошибки при выполнении. Поведение remove в случае открытого файла может различаться в зависимости от реализации. Требуется процедура ОС unlink.
#include int rename(const char *old, const char *new); int _rename_r(void *reent, const char *old, const char *new);
rename устанавливает новое имя файла (строка в new) для файла с именем *old. После успешного выполнения rename файл больше не доступен по имени *old. В противном случае с файлом с именем *old ничего не происходит. Ошибки выполнения зависят от опеpационной системы. Другая функция _rename_r является повторно-входимым аналогом. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости. В pезyльтате выдается 0 (в случае успешного выполнения) или -1 (когда файл не может быть пеpеименован). Стандарт ANSI требует наличия функции rename, но опpеделяет только ненyлевой pезyльтат в слyчае ошибки. Если *new является именем существующего файла, то обработка этого зависит от реализации. Требуются процедуры ОС: link, unlink.
#include void rewind(FILE *fp);
rewind возвращает индикатор позиции (если есть) в файле или потоке, определяемом fp в начало. Это также сбрасывает индикатор ошибки и прекращает весь не законченный вывод. rewind не возвpащает никакого pезyльтата. Стандарт ANSI требует наличия функции rewind. Никаких процедур ОС не требуется.
#include void setbuf(FILE *fp, char *buf);
setbuf определяет, что вывод в файл или поток, определенный fp, должен быть полностью буферизован. Весь вывод в этот файл будет идти через буфер (размера bufsiz, определенного в stdio.h). Вывод будет передаваться операционной системе только в случае заполнения буфера, или в случае операции ввода. Указатель на другой буфер может быть передан при помощи аргумента buf. Он должен иметь pазмеp bufsiz. Передача NULL в качестве значения buf показывает, что setbuf должен сам выделить буфер. Предупреждение: setbuf нельзя использовать после операций с файлами, отличными от открытия. Если передается не-NULL buf, то указываемая область памяти должна быть доступна до самого закрытия потока, определяемого fp. setbuf не возвpащает никакого pезyльтата. Как ANSI C, так и System V Interface Definition (выпуск 2) включают в себя setbuf. Тем не менее, значения указателя буфера NULL в них различаются: SVID выпуск 2 определяет, что указатель буфера NULL означает небуферизованный вывод. Для максимальной переносимости программ избегайте использования NULL как указателя буфера. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int setvbuf(FILE *fp, char *buf, int mode, size_t size);
setvbuf определяет способ буферизации файла или потока, определяемого fp, используя одно из следующих значений (из stdio.h) в качестве аргумента mode: _ionbf Не использовать буфер; передавать вывод прямо операционной системе для файла или потока, определенного fp. _iofbf Использовать полную буферизацию вывода: вывод передается операционной системе только в случае заполнения буфера или операции ввода. _iolbf Использовать построчную буферизацию: передавать вывод операционной системе при каждом знаке новой строки, также как в случае заполнения буфера или операции ввода. Аргумент size определяет размер буфера. Можно задать сам бyфеp, пеpедав yказатель на подходящyю область памяти как buf. В пpотивном слyчае можно пеpедать NULL как аpгyмент buf, и setvbuf выделит бyфеp. Пpедyпpеждение: setvbuf нельзя использовать после операций с файлами, отличными от открытия. Если передается не-NULL buf, то указываемая область памяти должна быть доступна до самого закрытия потока, определяемого fp. В слyчае yспешного выполнения выдается 0, в пpотивном слyчае выдается EOF (непpавильный mode или size может вызвать ошибкy). Как ANSI C, так и System V Interface Definition (выпуск 2) включают в себя setvbuf. Тем не менее, значения указателя буфера NULL в них различаются: SVID выпуск 2 определяет, что указатель буфера NULL означает небуферизованный вывод. Для максимальной переносимости программ избегайте использования NULL как указателя буфера. Обе спецификации требуют ненулевого результата в случае ошибки. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int siprintf(char *str, const char *format [, arg, . ]);
siprintf — ограниченная версия sprintf: она имеет те же аргументы и поведение, за исключением невозможности форматирования при наличии плавающей точки: спецификации типов f, g, g, e и f не распознаются. siprintf возвращает число байт в выведенной строке, не считая завершающего NULL. siprintf заканчивает работу, если встречает конец форматируемой строки. Стандарт ANSI не требует наличия функции siprintf. Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int printf(const char *format [, arg, . ]); int fprintf(FILE *fd, const char *format [, arg, . ]); int sprintf(char *str, const char *format [, arg, . ]);
printf принимает серию аргументов, применяя к каждому определитель формата из *format, и записывает форматированные данные в stdout, заканчивая вывод знаком NULL. Поведение printf не опpеделено в слyчае нехватки аргументов для фоpматиpования. printf заканчивает работу, если встречает конец форматируемой строки. Если аргументов больше, чем требуется, то лишние аргументы игнорируются. fprintf и sprintf совпадают с printf, за исключением направления форматированного вывода: fprintf выводит в заданный файл fd, а sprintf сохраняет вывод массиве знаков str. Для sprintf обработка переполнения *str не определена. format — указатель на строку знаков, содержащую два типа объектов: обычные знаки (отличные от %), которые выводятся неизмененными и спецификации преобразования, каждая из которых начинается с %. (Для включения % в вывод можно использовать %% в форматируемой строке.) Спецификации преобразования имеют следующую форму:
%[flags][width][.prec][size][type]
- flags необязательная последовательность знаков, управляющих расположением вывода, знаками чисел, десятичными точками, завершающими нулями, восьмеричными и шестнадцатиричными префиксами. Знаками флагов являются минус (-), плюс (+), пробел, ноль (0) и решетка (#). Они могут быть скомбинированы произвольным образом. — Преобразованная стpока сдвигается влево, добавляясь спpава пpопyсками. Если этот флаг не использyется, то выводимая стpока сдвигается впpаво, дополняясь пpопyсками слева. + В результате преобразование со знаком (как определено при помощи type) всегда с плюса или минуса. (Если этот флаг не стоит, то положительные числа выводятся без плюса.) » » (пробел) Если первый знак спецификации преобразования не является плюсом или минусом, или результат преобразования со знаком не имеет его, то результат начинается с пробела. Если флаг пробел ( ) и флаг плюс (+) появляются одновременно, то пробел игнорируется. 0 Если знаком type является d, i, o, u, x, X, e, E, f, g или G, то впереди идущие нули используются для добавления до нужной ширины поля, (в соответствии со всеми дpyгими настpойками); пpобелы для этого не использyются. Если ноль (0) и минус (-) указываются одновременно, то флаг ноль игнорируется. Для преобразований d, i, o, u, x и X, если определена точность prec, то флаг ноль (0) игнорируется. При этом 0 интерпретируется как флаг, а не как начало ширины поля. # Результат должен быть преобразован в альтернативную форму записи, в соответствии со следующим знаком: 0 увеличить точность, чтобы первая цифра результата была нулем. x ненулевой результат будет иметь префикс 0x. X ненулевой результат будет иметь префикс 0x. e, E или f Результат всегда будет содержать десятичную точку, даже если за ней не следуют десятичные знаки. (Обычно десятичная точка появляется только в том случае, когда за ней следуют десятичные знаки.) Нули в конце убираются. g или G тоже самое, что e или E, но нули на конце остаются. все остальные знаки их обработка не определена.
- width width — необязательный параметр, задающий минимальную ширину поля. Эта величина может быть прямо задана десятичным числом, или может быть задана косвенно при помощи астерикса (*), в этом случае аргумент типа int используется как ширина поля. Отрицательная ширина поля не поддерживается, если происходит попытка задать отрицательную ширину поля, то она интерпретируется как флаг минус (-), за которым следует положительная ширина поля.
- prec необязательный параметр; если он указан, то он начинается с `.’ (период). Это поле задает максимальное число выводимых знаков и минимальное число знаков в выводимом целом числе для преобразований с type d, i, o, u, x и X; максимальное число значащих цифр для преобразований g и G; или число знаков после десятичной точки для e, E, и f. Эта величина может быть прямо задана десятичным числом, или может быть задана косвенно при помощи астерикса (*), в этом случае аргумент типа int используется как точность. Задание отрицательной точности эквивалентно отсутствию этого аргумента. Если задан только период, то точность полагается равной нулю. Если точность задается с другими type, то обработка этой ситуации не определена.
- size h, l и L — необязательные знаки размеров, которые оказывают влияние несмотря на стандартную обработку printf аргументов данного типа. h определяет применение следующх type d, i, o, u, x или X к short или unsigned short. h также устанавливает применение следующего type n к указателю на short. Аналогично, l определяет применение следующх type d, i, o, u, x или X к long или unsigned long. l также устанавливает применение следующего type n к указателю на long. Если h или l появляются вместе с дpyгой опцией преобразования, то обpаботка этой ситyации не опpеделена. L определяет применение следующх type e, E, f, g или G к long double. Если L появляется вместе с дpyой опцией преобразования, то обpаботка этой ситyации не опpеделена.
- type type определяет тип осуществляемого преобразования, в соответствии со следующей таблицей: % выводит знак процента (%) c выводит arg как простой знак s выводит знаки до достижения точности или NULL; считывает указатель на строку d выводит десятичное целое со знаком; считывает int (тоже само что i) i выводит десятичное целое со знаком; считывает int (тоже само что d) o выводит восьмеричное целое со знаком; считывает int u выводит десятичное целое без знака; считывает int x выводит шестнадцатичное целое без знака (используя abcdef как цифры послу 9); считывает int X выводит шестнадцатичное целое без знака (используя ABCDEF как цифры послу 9); считывает int f выводит значение со знаком в виде [-]9999.9999; считывает число с плавающей точкой e выводит значение со знаком в виде [-]9.9999e[+|-]999; считывает число с плавающей точкой E выводит тоже самое, что и при e, но использует E для записи экспоненты; считывает число с плавающей точкой g выводит значение со знаком как в случае f или e, в зависимости от заданного значения и точности — нули на конце и десятичные точки печатаются только в случая необходимости; считывает число с плавающей точкой G выводит тоже самое, что и при g, но использует E для записи экспоненты; считывает число с плавающей точкой n сохраняет (в том же объекте) количество выведенных знаков; считывает указатель на int p выводит указатель в формате данной реализации. Эта реализация рассматривает его как unsigned long (тоже что и Lu).
Стандаpт ANSI C опpеделяет, что должен поддеpживаться фоpматиpованный вывод до 509 знаков.
Требуются процедуры ОС: close, fstat, isatty, lseek, read, sbrk, write.
#include int scanf(const char *format [, arg, . ]); int fscanf(FILE *fd, const char *format [, arg, . ]); int sscanf(const char *str, const char *format [, arg, . ]);
scanf считывает последовательность входных полей из стандартного ввода, один знак за раз. Каждое поле интерпретируется в соответствии с переданным определителем формата в форматированной строке *format. scanf сохраняет обработанный ввод из каждого поля по адресу, переданному, как аргумент после format. Должно быть задано столько же определителей формата и адресов, сколько и вводимых полей.
Должно быть передано достаточно адресов для данного формата; в противном случае результат непредсказуем и может иметь катастрофические последствия. Лишние переданные адреса игнорируются.
scanf часто выдает непредвиденные результаты, если ввод отличается от ожидаемого шаблона. Поскольку комбинация gets или fgets, за которыми следует sscanf проста и надежна, это наиболее предпочтительный способ, чтобы программа синхронизировала ввод и конец строки.
fscanf и sscanf совпадают со scanf, за исключением источника ввода: fscanf считывает данные из файла, а sscanf — из строки.
Строка *format — последовательность знаков, состоящая из нуля или более директив. Директивы состоят из одного или более знаков пропуска, других знаков и определителей формата.
Знаками пропуска являются пробел ( ), tab (\t) и новая строка (\n). Когда scanf встречает знаки пропуска в строке форматов, то он считывает их (но не сохраняет) до первого отличного от пропуска знака.
Отличными от пропуска знаками являются все остальные знаки ASCII, за исключением процента (%). Когда scanf встречает отличный от пропуска знак в строке форматов, то он считывает его, но не считывает выравнивающие пропуски.
Определители формата указывают scanf считывать и пpеобpазовывать знаки из вводимых полей в определенные типы величин, и сохраняет их по переданным адресам.
Остающиеся пропуски остаются непрочтенными, если только они не соответствуют в точности строке форматов.
Определитель формата должен начинаться с процента (%) и иметь следующую форму:
%[*][width][size]type
- необязательный знак; прекращает интерпретацию и определение этого вводимого поля
- width необязательная максимальная ширина поля: десятичное число, которое устанавливает максимальное число знаков, считываемых при преобразовании текущего вводимого поля. Если в вводимом поле меньше width знаков, то scanf считывает все знаки поля, а потом обрабатывает следующие поля и их спецификации. Если пpопyск или непреобразуемый знак встpечаются пеpед width, то все знаки до него считываются, пpеобразуются и сохpаняются. Затем scanf обpабатывает следyющий опpеделитель фоpмата.
- size h, l и L — необязательные параметры, которые переопределяют стандартный метод обработки scanf данных соответствующего аргументам типа.
Модификатор Тип (типы) h d, i, o, u, x преобразовывает ввод в short, сохраняет в объектах типа short h D, I, O, U, X никакого эффекта e, f, c, s, n, p l d, i, o, u, x преобразовывает ввод в long, сохраняет в объектах типа long l e, f, g преобразовывает ввод в double сохраняет в объектах типа double l D, I, O, U, X никакого эффекта c, s, n, p L d, i, o, u, x преобразовывает в long double, сохраняет в объектах типа long double L все остальные никакого эффекта
строки, содержащие только a, b, c и d.
строки, содержащие все знаки кроме a, b, c и d
строки, содержащие A, B, C, D, W, X, Y, Z
строки, содержащие знаки z, — и a Числа с плавающей точкой (для полей типов e, f, g, E, F и G ) должны соответствовать следующему формату:
[+/-] ddddd[.]ddd [E|e[+|-]ddd]
где объекты в квадратных скобках необязательны, а ddd представляет десятичные, восьмеричное или шестнадцатиричные цифры.
scanf возвращает число успешно введенных полей, преобразованных и сохраненных; возвращаемое значение не учитывает несохраненных считанных полей.
Если scanf пытается пpочитать конец файла, то возвpащается значение EOF.
Если ни одно поле не было сохpанено, то возвpащается 0.
scanf может прекратить считывание поля до достижения конечного знака поля или может целиком закончить работу.
- Знак подавления присваивания (*) появляется после % как определитель формата; текущее вводимое поле считывается, но не сохраняется.
- Знаки width уже были считаны (width — определитель ширины, положительное десятичное целое).
- Следующий знак не может быть преобразован в данном формате (например, если Z считывается при десятичном формате.
- Следующий знак не является допустимым знаком в вводимом поле.
- Следующий знак в вводимом поле несовместим с ссответствующим отличным от пропуска знаком в строке форматов.
- Следующий знак в вводимомом поле — EOF.
- Строка форматов кончилась.
Стандарт ANSI требует наличия функции scanf.
Требуются процедуры ОС close, fstat, isatty, lseek, read, sbrk, write.
#include FILE *tmpfile(void); FILE *_tmpfile_r(void *reent);
Создает временный файл (файл, который будет автоматически удален), используя имя, созданное tmpnam. Временный файл открывается в режиме wb+, разрешающем чтение и запись в любом месте как в двоичном файле (без всяких преобразований, которые операционная система может производить над текстовыми файлами.
Другая функция _tmpfile_r является повторно-входимым аналогом. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости.
tmpfile обычно возвращает a yказатель на временный файл. Если такой файл не может быть создан, то выдается NULL, и в errno записывается причина ошибки.
Как ANSI C, так и System V Interface Definition (выпуск 2) требуют наличия tmpfile.
Требуются процедуры ОС close, fstat, getpid, isatty, lseek, open, read, sbrk, write.
Для работы tmpfile требуетcя глобальный yказатель environ.
#include char *tmpnam(char *s); char *tempnam(char *dir, char *pfx); char *_tmpnam_r(void *reent, char *s); char *_tempnam_r(void *reent, char *dir, char *pfx);
Каждая из этих функций выдает имя временного файла. Получаемое имя гарантировано не является именем другого файла (если количество вызовов этих функций не превосходит TMP_MAX).
tmpnam создает имена файлов при помощи значения P_tmpdir (определенного в stdio.h), используя его как начало названия пути к временному файлу.
Аргумент tmpnam s задает область памяти для создания имени временного файла; если вызывается tmpnam(NULL), то используется внутренний статический буфер.
tempnam позволяет контролировать создание имен временных файлов: аргумент dir путь к директории для временных файлов, а аргумент pfx определяет префикс для базового имени файла.
Если dir равен NULL, то tempnam пытается использовать значение переменной среды TMPDIR; если такого значения нет, то tempnam использует значение P_tmpdir (определенное в stdio.h).
Если не требуется задавать префикс базового имени временных файлов, то NULL может быть передан tempnam в качестве аргумента pfx.
Другие функции _tmpnam_r и _tempnam_r являются повторно входимыми аналогами tmpnam и tempnam соответственно. Дополнительный аргумент reent — указатель на структуру, содержащую информацию для обеспечения повторной входимости.
Полyченные имена могyт слyжить в качестве имен вpеменных файлов, но сами по себе не делают файл вpеменным. Файлы с этими именами должны быть yдалены, когда они больше не нyжны.
Если область данных s пеpедана tmpnam, то там должно быть достаточно места для по кpайней меpе L_tmpnam элементов типа char.
Как tmpnam, так и tempnam возвpащают yказатель на созданное имя.
Стандарт ANSI требует наличия функции tmpnam, но не определяет использование P_tmpdir. System V Interface Definition (выпуск 2) требует как tmpnam, так и tempnam.
Требуются процедуры ОС close, fstat, getpid, isatty, lseek, open, read, sbrk, write.
Требуется глобальный yказатель environ.
#include #include int vprintf(const char *fmt, va_list list); int vfprintf(FILE *fp, const char *fmt, va_list list); int vsprintf(char *str, const char *fmt, va_list list); int _vprintf_r(void *reent, const char *fmt, va_list list); int _vfprintf_r(void *reent, FILE *fp, const char *fmt, va_list list); int _vsprintf_r(void *reent, char *str, const char *fmt, va_list list);
vprintf, vfprintf и vsprintf являются вариантами printf, fprintf и sprintf соответственно. Они отличаются только возможностью передачи им списка аргументов как объект va_list (инициализируемый va_start) вместо передачи как переменного числа аргументов.
Возвращаемые значения совпадают с возвращаемыми значениями соответствующих функций: vsprintf возвращает число байт в выводимой строке, за исключением завершающего NULL, vprintf и vfprintf возвращают число переданных знаков. В случае ошибки vprintf и vfprintf возвращают EOF. Никаких ошибок не выдает vsprintf.
Стандарт ANSI требует наличия всех трех функции.
Требуются процедуры ОС close, fstat, isatty, lseek, read, sbrk, write.
: Стандартные средства ввода / вывода
Этот файл объявляет стандартные средства IO. Из-за характера используемого оборудования, в avr — libc осуществлено только ограниченное количество стандартных функций IO. Фактически доступного выполняемого файла нет, может быть обслужено только одно устройство IO . Так как операционная система отсутствует, приложение должно обеспечить достаточно много деталей об устройствах, чтобы сделать их пригодными для использования стандартными средствами IO.
Из-за пространственных ограничений, некоторые функции не были осуществлены вообще (например некоторые из преобразований printf ). Также, пользователи должны быть предупреждены, что семейство функций printf и scanf , хотя обычно и связаны с простыми вещами, подобными всем известной программе » Hello , world !», фактически же являются довольно сложными, что приводит при их включении к съеданию достаточно большого пространства кода. Также, они — не быстры из-за характера интерпретации формата строки во время выполнения. Всякий раз, когда можно, следует прибегать (иногда не нормативно) к конверсионным средствам, которые предлагаются avr — libc , обычно это будет стоить много меньше в смысле скорости и размера кода.
Настраиваемые варианты — размер кода, против набора признаков
Чтобы позволить программистам, устанавливать размер кода в ущерб функциональным возможностям, функции vfprintf () которая является основой семейства printf , может быть выбрана в различных вариантах. Для подробностей смотрите документацию vfprintf (). То же самое относится к семейству функций vfscanf () и scanf .
Схема выбранного API
Стандартные потоки stdin , stdout , и stderr обеспечены, но вопреки C стандарту, так как avr — libc не имеет соответствующей информации о применимых устройствах, эти потоки не инициализируются при прикладном запуске. Также, так как в avr — libc вообще нет такого понятия как файл, нет и функции fopen () хотя она могла бы использоваться, чтобы связать поток с некоторым устройством.
Можно было осуществить абстракцию устройства, которое является совместимым с fopen () но так как это потребовало бы, анализировать строку, и брать всю необходимую информацию или из этой строки, или из дополнительной таблицы, которая должна была бы быть обеспечена приложением, этот подход не был предпринят.
Вместо этого, обеспечена функция fdevopen () , для связи потока с устройством, которое должно обеспечить функцию приёма — передачи символа. В avr — libc нет дифференцирования между текстовым и бинарным потоками. Символ \ n посылается непосредственно устройству функцией put () . Если устройство требует перевода каретки — символ ( \ r ), который будет послан перед переводом строки, это должна осуществить подпрограмма put ().
Это в основном следует за подходом Unix: если устройство типа терминала нуждается в специальной обработке, это находится в области оконечного драйвера устройства, чтобы обеспечить эти функциональные возможности. Таким образом, простая функция подходящая на put () для fdevopen () общающаяся с интерфейсом UART могла бы выглядеть так:
uart_putchar(char c, FILE *stream)
if (c == '\n')
uart_putchar('\r');
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
Как альтернатива функции fdevopen(), может использоваться макрокоманда fdev_setup_stream() при установке обеспеченная пользователем структура FILE.
Следует отметить, что автоматическое преобразование символа newline в перевод каретки — newline нарушает последовательность двоичных передач. Если двоичные передачи желательны, не должно выполняться никакое автоматическое преобразование, но вместо этого никакая строка, которая нацеливает, последовательность CR-LF должна явно использовать «\r\n».
Для удобства, при первом запросе fdevopen () открывается поток для чтения, и заставит заканчивающийся поток быть aliased к stdin . Аналогично, при первом запросе fdevopen () открывается поток для записи, и заставит заканчивающийся поток быть aliased к обоим, stdout , и stderr . Таким образом, если открытие было сделано с обоими, с намерением чтения и записи, все три стандартных потока будут идентичны. Обратите внимание, что эти псевдонимы неразличимы друг от друга, таким образом, запрос fclose () на таком потоке также закроет все его псевдонимы. Это исполнение было выбрано, потому что стоимость поддержания псевдонима значительно меньше, чем стоимость поддержания полных копий каждого потока. Все же, обеспечивая выполнение, которое предлагает, законченный набор стандартных потоков, как считали, был полезным. Не только потому, что запись printf () вместо fprintf ( mystream . ) проще печатать, но так как avr — gcc должные к курорту передать все параметры функций variadic на стеке (в противоположность прохождению их в регистраторах для функций, которые берут установленный номер параметров), способность передать один параметр меньше, подразумевая stdin также сэкономит некоторое время выполнения
Можно связать дополнительные пользовательские данные с потоком, использованием fdev _ set _ udata (). Внутренний помещенный и добираются, функции могут тогда извлечь это пользовательское использование данных fdev _ get _ udata (), и действие соответственно. Например, могла использоваться единственная помещенная функция, чтобы общаться с двумя различными UART , которые тот путь, или помещенный и получать функции мог там сохранить внутренним состоянием между запросами.
Форматирование строки во flash ROM
Все функции семейства printf и scanf имеют два варианта: стандартное имя, когда строка формата, как ожидается, будет находиться в SRAM , а так же версия с суффиксом «_P», когда строка формата, как ожидается, постоянно находится во flash ROM . Макрокоманда PSTR (см. avr / pgmspace . h >: Program Space Utilities ) становится очень удобной для объявления формата строк.
Запуск stdio без malloc ().
По умолчанию, fdevopen () требует malloc (). Поскольку для ограниченной среды микроконтроллера это часто не желательно, то обеспечена альтернативная опция для работы полностью без malloc ().
Обеспечена макрокоманда fdev _ setup _ stream (), чтобы подготовить снабженный пользователем буфер FILE для действий с stdio .
Пример
#include
static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
static int
uart_putchar(char c, FILE *stream)
if (c == '\n')
uart_putchar('\r', stream);
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
main(void)
init_uart();
stdout = &mystdout;
printf("Hello, world!\n");
return 0;
Этот пример использует форму инициализии FDEV _ SETUP _ STREAM () вместо подобной функции fdev _ setup _ stream (), так что вся инициализация данных происходит в течение запуска C.
Если потоки, инициализировавшие этот путь больше не нужны, то они могут быть разрушены первым запросом макрокоманды fdev _ close (), и затем следует разрушение непосредственно объекта. Запрос к fclose () не должен быть выпущен для этих потоков. При запросе fclose () непосредственно безопасен, он вызовет неопределенную ссылку к free () и таким образом заставляет компоновщик связывать модуль malloc в приложение .
Макроопределения
#define putc(__c, __stream) fputc(__c, __stream)
Только псевдоним для int fputc (int __c, FILE *__stream). Передаёт символ c (хотя тип int ) в stream . Возвращает символ, или EOF в случае ошибки.
#define getc(__stream) fgetc(__stream)
Только псевдоним для int fgetc (FILE * __stream). Принимает символ из stream . Возвращает символ, или EOF в случае столкновения с концом файла, или ошибки. Для различения этих ситуаций нужно использовать функции feof () или ferror () .
#define putchar(__c) fputc(__c, stdout)
Предаёт символ c в stdout .
#define getchar() fgetc(stdin)
Принимает символ из stdin . Возвращает символ, или EOF в случае столкновения с концом файла, или ошибки. Для различения этих ситуаций нужно использовать функции feof () или ferror () .
#define FILE struct __file
FILE является структурой, которую передают между различными стандартными функциями IO .
#define stdin (__iob[0])
Входной поток для упрощенных функций, не берущих stream . Первый поток открытый для чтения fdevopen () будет назначен на stdin .
#define stdout (__iob[1])
Входной поток для упрощенных функций, не берущих stream . . Первый поток открытый для чтения fdevopen () будет назначен на stdin , и stderr .
#define stderr (__iob[2])
Поток для вывода ошибки. Если не назначено иначе, идентичен stdout . Если stderr должен указать на другой поток, результат другого fdevopen () должен быть явно назначен на него, не закрывая предыдущий stderr (иначе закроется и stdout ).
EOF объявляет значение, которое возвращается различными стандартными функциями IO в случае ошибки . Начиная с платформы AVR ( в настоящее время ) не содержит абстракцию для фактических файлов, ее начало координат, поскольку «конец файла» является здесь несколько бессмысленным .
#define _FDEV_ERR (-1)
Возвращаемое значение конца файла, при чтении. Используется в функции fdevopen () .
#define _FDEV_EOF (-2)
Возвращаемое значение при возникновении ошибки, при чтении. Используется в функции fdevopen () .
#define _FDEV_SETUP_READ __SRD
#define _FDEV_SETUP_WRITE __SWR
#define _FDEV_SETUP_RW (__SRD|__SWR)
fdev _ setup _ stream () с намерением чтения — записи
Эта макрокоманда освобождает любые библиотечные ресурсы, которые могли бы быть связаны со stream . Вызывается если stream больше не нужен, прежде чем приложение собирается уничтожать непосредственно объект stream . (В настоящее время, эта макрокоманда не используется, но это может измениться в будущих версиях библиотеки.)
#define fdev_get_udata(stream) ((stream)->udata)
Эта макрокоманда восстанавливает(находит) указатель на определяемые пользователем данные из объекта потока FILE .
#define fdev_set_udata(stream, u) do < (stream)->udata = u; > while(0)
Эта макрокоманда вставляет указатель на определяемые пользователем данные в объект потока FILE . Пользовательские данные могут быть полезны для того, чтобы проследить состояние в помещенном и получить функции, поставляемые к функции fdevopen ().
#define fdev_setup_stream(stream, put, get, rwflag)
#define FDEV_SETUP_STREAM(put, get, rwflag)
Инициализатор для обеспеченного пользователем потока stdio . Эта макрокоманда действует подобно fdev _ setup _ stream (), но должна использоваться как инициализатор переменную типа FILE . Параметры сохранения должны использоваться как объяснено в fdev _ setup _ stream ().
int fgetc (FILE *__stream)
Принимает символ из stream . Возвращает символ, или EOF в случае столкновения с концом файла, или ошибки. Для различения этих ситуаций нужно использовать функции feof () или ferror ().
int fputc (int __c, FILE *__stream)
Передаёт символ c (хотя тип int ) в stream . Возвращает символ, или EOF в случае ошибки.
int puts (const char *__str)
Записывает строку, на которую указывает str , и перемещает символ newline , в stdout . Функция puts () использует определение putchar () для посимвольного вывода строки в порт RS 232, назначенный последним. Предположим, у нас есть определение строки, предназначенной для вывода через последовательный интерфейс: char s [6] = «12345»; Вызов функции puts () для вывода этой строки выглядит просто как puts ( s ).
int puts_P (const char *__str)
Вариант puts () но str постоянно находится в памяти программ
int fputs (const char *__str, FILE *__stream)
Передаёт строку, на которую указывают str в поток stream . Возвращает 0 при успехе и EOF при ошибке.
int fputs_P (const char *__str, FILE *__stream)
Вариант fputs () но str постоянно находится в памяти программ.
int vfprintf (FILE *__stream, const char *__fmt, va_list __ap)
Выполняет форматированный вывод в поток в stream . Подробности см. ниже.
vfprintf — центральное средством семейства функций printf . Она выводит отформатированные значения, с помощью fmt в stream . Фактические значения печатати передаются как переменный параметр list ap
vfprintf возвращает количество символов, записанных в stream , или EOF в случае ошибки. В настоящее время, это случится, только если stream был открыт не с целью записи.
Спецификации преобразования в строке шаблона имеют общую форму: % флаги ширины [. точность] тип преобразования
Формат строки состоит из нуля или большего количества директив: обычных символов (не % ), которые копируются в выходной поток — как есть, и спецификаторов форматирования, каждый из которых приводит к нулю выборки или большему количеству последующих параметров. Каждый спецификатор форматирования начинается с символа % . Параметры должны должным образом соответствовать спецификатору форматирования. После знака % , в последовательности следует:
- Нуль или большее количество символов флага, которые изменяют нормальное поведение спецификации преобразования:
- # Значение должно быть преобразовано в «дополнительную форму». Для c , d , i , s , и u преобразований, эта опция не эффективна. Для o преобразований, точность номера увеличена, чтобы вызвать первый символ строки вывода к нулю (кроме того, если нулевое значение напечатано с явной точностью нуля). Для x и X преобразований, ненулевой результат имеет строку `0 x ‘ (или `0 X ‘ для X преобразования) предшествовавший этому.
- 0 (нуль) дополнение нулями. Для всех преобразований, преобразованное значение дополняется нулями с слева, а не пробелами. Если точность даётся с числовым преобразованием ( d , i , o , u , i , x , и X ), флаг 0 игнорируется.
- — Отрицательный флаг ширины поля; преобразованное значение нужно оставить откорректированным на полевой границе. Преобразованное значение дополняется пробелами справа, а не с слева пробелами или нулями. A — отмены 0 если даются оба.
- ‘ ‘ (пробел) Пробел нужно оставить перед положительным номером, произведенным преобразованием со знаком ( d , или i ).
- + знак, всегда должен помещаться перед числом, произведенным преобразованием со знаком. Отмены + пробел, если оба используются.
- Десятичное целое число, определяющее минимальную ширину поля. Если нормальное преобразование производит меньшее количество символов чем ширина поля, то оно дополняется пробелами слева до заданной ширины (или справа, если установлен флаг левой настройки).
- Дополнительная точность, в форме периода . сопровождаемый дополнительной цифровой строкой. Если цифровая строка опущена, точность взята как нуль. Это дает минимальный номер цифр, чтобы появиться для преобразований d , i , o , u , x , и X , или максимальное число символов, которое будет напечатано от строки для s преобразования.
- Дополнительный l или h модификатор длины, это определяет что параметр для преобразования d , i , o , u , x , или X является » long int » вместо int . h игнорируется, как «short int » является эквивалентным int .
- Символ, который определяет тип преобразования, которое будет применено.
Спецификаторы и их значения:
- dioux X Параметр int (или соответствующий вариант) преобразован в десятичное число со знаком ( d и i ), восьмеричный без знака ( o ), десятичный без знака ( u ), или шестнадцатеричный без знака ( x и X ) примечание. Символы » abcdef » используются для x преобразований; символы » ABCDEF » используются для X преобразований. Точность, если таковые вообще имеются, дает минимальный номер цифр, которые должны появиться; если преобразованное значение требует меньшего количества цифр, дополняется нулями слева.
- p Параметр void * взят как целое число без знака, и преобразован подобно как сделала бы команда %#x .
- c Параметр int преобразован в » unsigned char » , и символ окончания написан.
- s Параметр » char * » как ожидается, будет указателем на массив символьного типа (указатель на строку). Символы от массива написаны до (но не, включая) закончившийся символ NUL ; если точность определена, не больше, чем номер указанный написан. Если точность дается, никакая потребность нулевого символа не присутствует; если точность не определена, или больше чем размер массива, массив должен содержать закончившийся символ NUL.
- % A % написан. Никакой параметр не преобразован. Законченная конверсионная спецификация «%%».
- eE Двойной параметр округлен и преобразован(конвертирован) в формате «[-] d . ddde ± dd » где есть одна цифра перед символом десятичной точки и номером цифр после того, как это равно точности; если точность отсутствует, это взято, как 6; если точность является нулевой, никакой символ десятичной точки не появляется. E преобразование использует символ ‘E’ (а не ‘e’ ) вводить экспоненту. Экспонента всегда содержит две цифры; если значение является нулевым, экспонента — 00.
- fF Двойной параметр округлен и преобразованное в представление десятичных чисел в формате «[-] ddd . ddd » , где номер цифр после символа десятичной точки равен спецификации точности. Если точность отсутствует, это взято, как 6; если точность является явно нулевой, никакой символ десятичной точки не появляется. Если десятичная точка появляется, не менее одна цифра появляется прежде, чем это.
- gG Двойной параметр преобразован(конвертирован) в стиле f или e (или F или E для Г преобразования). Точность определяет номер значащих цифр. Если точность отсутствует, 6 цифр даются; если точность является нулевой, это обработано как 1. Стиль e используется, если экспонента от ее преобразования меньше чем-4 или больше чем или равна точности. Конечные нули удалены из дробной части результата; десятичная точка появляется, только если это сопровождается не менее одной цифрой.
- S Подобен формату s , кроме указателя, как ожидается, укажет на память программ ( ROM ) строка вместо строки в RAM .
Ни в каком случае делает несуществующая или маленькая ширина поля вызывает усечение числового поля; если результат преобразования шире чем ширина поля, поле расширено, чтобы содержать конверсионный результат.
Так как полное выполнение всех упомянутых особенностей становится довольно большим, vfprintf () может быть выбран в трёх разных вариантах. По умолчанию vfprintf () справляется со всеми упомянутыми функциями, кроме преобразований с плавающей точкой. Доступна свернутая версия vfprintf (), которая осуществляет только основные целочисленные и строковые конверсионные средства, может быть определена только дополнительная опция # , используя конверсионные флаги (эти флаги анализируются правильно от спецификации формата, но просто игнорируются). Эту версию можно требовать, используя следующие опции компилятора:
-Wl,-u,vfprintf -lprintf_min
Если требуются полные функциональные возможности, включая преобразования с плавающей то, должны использоваться:следующие варианты
-Wl,-u,vfprintfОграничения:
· Указанная ширина и точность могут быть не более 255.
· Для преобразований с плавающей точкой, если Вы связываете заданную по умолчанию или свернутую версию vfprintf () , символ? выведется и двойной параметр будет skiped . Так что Вы выводите, ниже не будет разбит. Для заданной по умолчанию версии поле ширины и «клавиатура к левый» (символ минус) опция будет работать в этом случае.
· Модификатор длины hh игнорируется ( символ параметр — promouted к int ). Более точно, эта реализация не проверяет номер символы h .
· Но ll модификатор длины будет, чтобы прервать вывод, поскольку эта реализация не работает long long параметры.
Переменная ширина или поле точности (звездочка * символ) не понят(не реализован), и будет, чтобы прервать вывод.
int vfprintf_P (FILE *__stream, const char *__fmt, va_list __ap)
Вариант vfprintf () использует fmt строки постоянно находящийся в памяти программ.
int printf (const char *__fmt. )
Выполняет форматированный вывод в поток stderr . См. для подробностей vfprintf ().
int printf_P (const char *__fmt. )
Вариант printf () использует fmt строки постоянно находящийся в памяти программ.
int vprintf (const char *__fmt, va_list __ap)
int sprintf (char *__s, const char *__fmt. )
Вариант printf () , посылает отформатированные символы строке s .
int sprintf_P (char *__s, const char *__fmt. )
Вариант sprintf () использует fmt строки постоянно находящийся в памяти программ.
int snprintf (char *__s, size_t __n, const char *__fmt. )
Подобна sprintf () , но вместо принятия(предположения) s иметь бесконечный размер, не больше, чем n символы (включая конечный символ NUL) будут преобразованы в s . Возвращает число символов, которое было бы записано в s если было достаточно пространства.
int snprintf_P (char *__s, size_t __n, const char *__fmt. )
Вариант snprintf () использует fmt строки постоянно находящийся в памяти программ.
int vsprintf (char *__s, const char *__fmt, va_list ap)
Подобна sprintf () но берет переменный список параметров.
int vsprintf_P (char *__s, const char *__fmt, va_list ap)
Вариант vsprintf () использует fmt строки постоянно находящийся в памяти программ.
int vsnprintf (char *__s, size_t __n, const char *__fmt, va_list ap)
Подобна vsprintf () , но вместо принятия(предположения) s иметь бесконечный размер, не больше символы, чем n (включение перемещения символ NUL ) будет преобразован в s . Возвращает число символов, которое было бы записано в s если было достаточно пространства.
int vsnprintf_P (char *__s, size_t __n, const char *__fmt, va_list ap)
Вариант vsnprintf () использует fmt строки постоянно находящийся в памяти программ.
int fprintf (FILE *__stream, const char *__fmt. )
Выполняет отформатированный вывод в stream . См. для подробностей vfprintf () .
int fprintf_P (FILE *__stream, const char *__fmt. )
Вариант fprintf () использует fmt строки постоянно находящийся в памяти программ.
char * fgets (char *__str, int __size, FILE *__stream)
Читает не более size — 1 байт из stream , пока с newline символом не сталкивались, и память символы в буфере, на который указывают str . Если с ошибкой не сталкивались при чтении, строка будет тогда закончена с символ NUL . При возникновении ошибки функция возвращает NULL и наборы флаг ошибки stream , который может быть проверен, используя ferror (). Иначе возвращается указатель на строку.
char * gets (char *__str)
Подобныа fgets () за исключением того, что это оперирует с потоком stdin , и перемещение newline (если любой) не будет сохранен в строке. Это — ответственность вызывающей программы обеспечить достаточную память, чтобы держать чтение символов.
int vfscanf (FILE *__stream, const char *__fmt, va_list __ap)
Отформатированный ввод. Подробности см. ниже.
Отформатированный ввод. Эта функция — основа семейства функций scanf .
Символы читаются из stream и обрабатывается в пути, описанном fmt . Конверсионные результаты будут назначены на параметры, прошел via ap .
Формат строки fmt просмотрен для конверсионных спецификаций. Что — нибудь, что не включает конверсионную спецификацию, принято как текст, который согласован буквально против ввода. Незаполненное пространство в строке формата будет соответствовать любому незаполненному пространству в данных (не включая ни один), все другие символы соответствуют только непосредственно. Обработка прервана, как только данные и строка формата больше не соответствуют, или есть ошибка или состояние конца файла на stream .
Большинство пропуска преобразований, ведущего незаполненное пространство перед стартом фактического преобразования.
Преобразования начаты с символа %. За % могут следовать разные варианты:
- * указывает, что преобразование должно быть выполнено, но конверсионный результат, должен быть отвергнут; никакие параметры не будут обработаны из ap ,
- h указывает, что параметр является указателем на short int (вместо int ),
- h h указывают, что параметр является указателем на char ( rather than int ).
- l указывает, что параметр является указателем на long int (скорее than int , для преобразований целочисленных типов), или указатель на double (для преобразований с плавающей точкой),
Кроме того, максимальная ширина поля может быть определена как положительное десятичное целое число отличное от нуля, который ограничит преобразование в большинство это много символов от входного потока. Эта ширина поля ограничена не более 255 символами, которое также является значением по умолчанию (если бы не c преобразование, что значения по умолчанию к 1).
Следующие конверсионные флаги поддерживаются :
- % Соответствует буквальному символу %. Это — не преобразование .
- d Пары произвольно десятичное целое число со знаком; прямой указатель должен быть указателем на int .
- i Пары произвольно целое число со знаком; прямой указатель должен быть указателем на int . Целое число читается в ядре 16, если это начинается 0x или 0X, в ядре 8, если это начинается 0, и в ядре 10 иначе. Только символы, которые соответствуют ядру, используются .
- o Соответствует восьмеричному целому числу; прямой указатель должен быть указателем на int без знака .
- u Соответствует произвольно десятичному целому числу со знаком; прямой указатель должен быть указателем на unsigned int .
- x Соответствует произвольно шестнадцатеричному целому числу со знаком; прямой указатель должен быть указателем на int без знака .
- f Соответствует произвольно числу с плавающей запятой со знаком; прямой указатель должен быть указателем на float .
- e , g , F , E , G Эквивалент f .
- s Соответствует последовательности символов ненезаполненного пространства; прямой указатель должен быть указателем на char , и массив должен быть большой достаточно к ввод все последовательность и завершение символ NUL . Входная строка останавливается в незаполненном пространстве или в максимальной ширине поля, какой бы ни происходит сначала .
- c Соответствует последовательности символов счета ширины (значение по умолчанию 1); прямой указатель должен быть указателем на char , и должен быть достаточный участок памяти для всех символов (никакое завершение NUL добавляется). Обычный пропуск продвижения незаполненного пространства подавлен. Чтобы пропускать незаполненное пространство сначала, используйте в формате явное пространство .
- [ Соответствует непустой последовательности символов от указанного набора принятых символов; прямой указатель должен быть указателем на char , и должен быть достаточный участок памяти для всех символов в строке, плюс завершение NUL символ. Обычный пропуск продвижения незаполненного пространства подавлен. Строка должна быть составлена из символов в (или не в) определенный набор; набор определен символами между открытой скобкой [символ и близкая скобка] символ. Набор исключает те символы, если первый символ после открытой скобки — циркумфлекс ^ . Чтобы включать близкую скобку в набор, делайте это первым символом после открытой скобки или циркумфлекса; любая другая позиция закончит набор. Символ дефиса — является также специальным; когда помещено между двумя другими символами, это добавляет все прошедшие символы к набору. Чтобы включать дефис, делайте это последним символом перед конечной(заключительной) близкой скобкой. Например, [^] 0-9-] означает набор все кроме близкой скобки, обнулите до девять, и дефис. Строка заканчивается появлением(видом) символа не в (или, с циркумфлексом, в) набор или когда ширина поля выполняется. Обратите внимание, что использование этого преобразования увеличивает расход стека .
- p Соответствует значению указателя (как напечатано p в printf () ); прямой указатель должен быть указателем на пусто.
- n Ничто не ожидается; вместо этого, число символов, использованное к настоящему времени от ввода сохранено через прямой указатель, который должен быть указателем на int . Это — не преобразование, хотя это может быть подавлено с * флажок .
Эти функции возвращают номер входных назначенных элементов(пунктов), которые могут быть меньше чем обеспеченный для, или даже обнулять, в случае отказа(неудачи) соответствия. Нуль указывает, что, в то время как был доступный ввод, никакие преобразования не были назначены; типично это происходит из-за недопустимого входного символа, типа алфавитного символа для a d преобразование. Значение Конец файла возвращен, если входной отказ(неудача) происходит прежде, чем любое преобразование типа конца файла происходит. Если ошибка или конец файла происходят после того, как преобразование началось, номер преобразований, которые были успешно закончены, возвращен.
По умолчанию, все преобразования, описанные выше доступны кроме преобразований с плавающей точкой, и ширина ограничена 255 символами. Преобразование пункта(точки) с плавающей точкой будет доступно в расширенной(продленной) версии, обеспеченной библиотекой libscanf_flt.a . Также в этом случае(регистре) ширина не ограничена (точно, это ограничено 65535 символами). Чтобы связать программу против расширенной(продленной) версии, используйте следующие флажки компилятора в стадии связи(ссылки):
-Wl,-u,vfscanf -lscanf_flt -lm
Третья версия доступна для сред, которые являются плотными(напряженными) на пространстве(пробеле). В дополнение к ограничениям стандартного, эта версия осуществляет нет % [ спецификация. Эта версия обеспечена в библиотеке libscanf_min.a , и можно требовать, используя следующие варианты в стадии связи(ссылки):
int vfscanf_P (FILE *__stream, const char *__fmt, va_list __ap)
Вариант vfscanf () использование строки fmt в памяти программ.
int scanf (const char *__fmt. )
The function scanf performs formatted input from stream stdin . See vfscanf() for details.
int scanf_P (const char *__fmt. )
Variant of scanf() where fmt resides in program memory.
int fscanf (FILE *__stream, const char *__fmt. )
The function fscanf performs formatted input, reading the input data from stream . See vfscanf() for details.
int fscanf_P (FILE *__stream, const char *__fmt. )
Variant of fscanf() using a fmt string in program memory.
int vscanf (const char *__fmt, va_list __ap)
int sscanf (const char *__buf, const char *__fmt. )
The function sscanf performs formatted input, reading the input data from the buffer pointed to by buf . See vfscanf() for details
int sscanf_P (const char *__buf, const char *__fmt. )
Variant of sscanf() using a fmt string in program memory.
FILE * fdevopen (int(*put)(char, FILE *), int(*get)(FILE *))
функция — замена для fopen () . Подробности см. ниже.
Эта функция — замена для fopen () .
Это открывает поток для устройства, где фактическое выполнение устройства должно быть обеспечено приложением. Если успешно, указатель на структуру для открытого потока возвращен. Причины для возможного отказа(неудачи) в настоящее время не включают это ни один помещенный ни доберитесь параметр был обеспечен, таким образом пытаясь открыть поток без намерения IO вообще, или что недостаточная динамическая память является доступной, чтобы установить новый поток.
Если помещенный указатель функции обеспечен, поток открыт с намерением записи. Функция прошла как помещенный взял бы два параметра, первый символ, чтобы записать на устройство, и второй указатель на FILE , и должен возвратиться 0, если вывод был успешен, и значение отличное от нуля, если символ нельзя было бы послать устройству.
Если доберитесь указатель функции обеспечен, поток открыт с намерением чтения. Функция прошла как доберитесь должен взять указатель на FILE как его единственный(отдельный) параметр, и возвратить один символ из устройства, прошел как тип int . Если ошибка происходит при попытке читать от устройства, это должно возвратиться _FDEV_ERR . Если условие(состояние) конца файла было достигнуто при чтении от устройства, _FDEV_EOF будет возвращен.
Если обе функции обеспечены, поток открыт с чтением и записывать намерение.
Первый поток открылся с намерением чтения, назначен на stdin , и первый открылся с намерением записи, назначен на оба, stdout и stderr .
fdevopen () использ etn calloc () ( und таким образом malloc ()) чтобы распределять память для нового потока.
Примечание :
Если макрокоманда __ STDIO _ FDEVOPEN _ COMPAT _12 объявлен прежде, чем включение < stdio . h >, функциональный прототип для fdevopen () будет выбран, что является назад совместимым с avr — libc версией 1.2 и прежде. Это — исключительно intented для того, чтобы обеспечить простой путь перемещения без потребности немедленно заменить все исходный текст. Не используйте для нового кода .
int fclose (FILE *__stream)
Функция закрытия stream , и отвергает дальнейший IO от и к этому. При использовании fdevopen () при установке потока, запрос к fclose () необходим чтобы к свободному внутренние распределенные ресурсы. Если поток был установлен, используя fdev _ setup _ stream () или FDEV _ SETUP _ STREAM (), используйте fdev_close (). В настоящее время всегда возвращается 0 (для успеха).
int feof (FILE *__stream)
Проверяет флаг конца файла stream . Этот флаг может быть очищен только запросом clearerr ().
int ferror (FILE *__stream)
Проверяет флаг ошибки stream . Этот флаг может быть очищен только запросом clearerr ().
int ungetc (int __c, FILE *__stream)
Функция ungetc () помещает символ c (преобразовал в символ без знака) назад на входной поток, на который указывают stream . Назад помещенный символ будет возвращен последующим чтением на потоке. В настоящее время, только один единственный символ может быть пододвинут обратно на поток. Функция ungetc () возвращает символ, пододвинутый обратно после преобразования, или EOF при сбое операции. Если значение параметра символ c равняется EOF , операция будет терпеть неудачу, и поток останется неизменным
int fflush (FILE *stream)
Сброс stream . Это — пустая операция, предусмотрел совместимость исходного текста только, поскольку стандартное выполнение IO в настоящее время не исполняет никакой буферизации.
void clearerr (FILE *__stream)
Очищает ошибку и флаги конца файла stream .
size_t fwrite (const void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)
Записывает объекты nmemb , size байт каждый, в stream . Первым байтом первого объекта ссылаются ptr . Возвращает количество успешно переданных объектов, т.e. nmemb если не произошла ошибка вывода
size_t fread (void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)
Чтение объектов nmemb , size байт каждый, из stream в буфер, на который указывают ptr . Возвращает количество успешно прчитанных объектов, т. e. nmemb если не произошла входная ошибка, и не сталкивались с концом файла. Должен использоваться feof () и ferror (), чтобы различить эти два состояния.
Stdio h c что это
Определенные в функции ввода-вывода, а также типы и макросы составляют приблизительно одну треть библиотеки.
Поток — это источник или получатель данных; его можно связать с диском или с каким-то другим внешним устройством. Библиотека поддерживает два вида потоков: текстовый и бинарный, хотя на некоторых системах, в частности в UNIX, они не различаются. Текстовый поток — это последовательность строк; каждая строка имеет нуль или более символов и заканчивается символом ‘\n’ . Операционная среда может потребовать коррекции текстового потока (например, перевода ‘\n’ в символы «возврат каретки» и «перевод строки»).
Бинарный поток — это последовательность непреобразованных байтов, представляющих собой некоторые промежуточные данные, которые обладают тем свойством, что если их записать, а затем прочесть той же системой ввода-вывода, то мы получим информацию, совпадающую с исходной.
Поток соединяется с файлом или устройством посредством его открытия, указанная связь разрывается путем закрытия потока. Открытие файла возвращает указатель на объект типа FILE, который содержит всю информацию, необходимую для управления этим потоком. Если не возникает двусмысленности, мы будем пользоваться терминами «файловый указатель» и «поток» как равнозначными.
Когда программа начинает работу, уже открыты три потока: stdin, stdout и stderr.
B1.1. Операции над файлами
Ниже перечислены функции, оперирующие с файлами. Тип size_t — беззнаковый целочисленный тип, используемый для описания результата оператора sizeof.
FILE *fopen(const char *filename, const char *mode);
fopen открывает файл с заданным именем и возвращает поток или NULL , если попытка открытия оказалась неудачной. Режим mode допускает следующие значения:
текстовый файл открывается для чтения (от read (англ.) — читать);
«w» текстовый файл создается для записи; старое содержимое (если оно было) выбрасывается (от write (англ.) — писать);
«а» текстовый файл открывается или создается для записи в конец файла (от append (англ.) — добавлять);
«r+» текстовый файл открывается для исправления (т. е. для чтения и для записи);
«w+» текстовый файл создается для исправления; старое содержимое (если оно было) выбрасывается;
«a+» текстовый файл открывается или создается для исправления уже существующей информации и добавления новой в конец файла.
Режим «исправления» позволяет читать и писать в один и тот же файл; при переходах от операций чтения к операциям записи и обратно должны осуществляться обращения к fflush или к функции позиционирования файла. Если указатель режима дополнить буквой b (например « rb » или « w+b »), то это будет означать, что файл бинарный. Ограничение на длину имени файла задано константой FILENAME_MAX . Константа FOPEN_MAX ограничивает число одновременно открытых файлов.
FILE *freopen(const char *filename, const char *mode, FILE *stream);
freopen открывает файл с указанным режимом и связывает его с потоком stream. Она возвращает stream или, в случае ошибки, NULL . Обычно freopen используется для замены файлов, связанных с stdin, stdout или stderr, другими файлами.
int fflush(FILE *stream);
Применяемая к потоку вывода функция fflush производит дозапись всех оставшихся в буфере (еще не записанных) данных, для потока ввода эта функция не определена. Возвращает EOF в случае возникшей при записи ошибки или нуль в противном случае. Обращение вида fflush(NULL) выполняет указанные операции для всех потоков вывода.
int fclose(FILE *stream);
fсlose производит дозапись еще не записанных буферизованных данных, сбрасывает несчитанный буферизованный ввод, освобождает все автоматически запрошенные буфера, после чего закрывает поток. Возвращает EOF в случае ошибки и нуль в противном случае.
int remove(const char *filename);
remove удаляет файл с указанным именем; последующая попытка открыть файл с этим именем вызовет ошибку. Возвращает ненулевое значение в случае неудачной попытки.
int rename(const char *oldname, const char *newname);
rename заменяет имя файла; возвращает ненулевое значение в случае, если попытка изменить имя оказалась неудачной. Первый параметр задает старое имя, второй — новое.
FILE *tmpfile(void);
tmpfile создает временный файл с режимом доступа «wb+», который автоматически удаляется при его закрытии или обычном завершении программой своей работы. Эта функция возвращает поток или, если не смогла создать файл, NULL .
char *tmpnam(char s[L_tmpnam]);
tmpnam(NULL) создает строку, не совпадающую ни с одним из имен существующих файлов, и возвращает указатель на внутренний статический массив. tmpnam(s) запоминает строку в s и возвращает ее в качестве значения функции; длина s должна быть не менее L_tmpnam. При каждом вызове tmpnam генерируется новое имя; при этом гарантируется не более TMPMAX различных имен за один сеанс работы программы. Заметим, что tmpnam создает имя, а не файл.
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
setvbuf управляет буферизацией потока; к ней следует обращаться прежде, чем будет выполняться чтение, запись или какая-либо другая операция, mode со значением _IOFBF вызывает полную буферизацию, с _IOLBF — «построчную» буферизацию текстового файла, a mode со значением _IONBF отменяет всякую буферизацию. Если параметр buf не есть NULL, то его значение — указатель на буфер, в противном случае под буфер будет запрашиваться память. Параметр size задает размер буфера. Функция setvbuf в случае ошибки выдает ненулевое значение.
void setbuf(FILE *stream, char *buf);
Если buf есть NULL , то для потока stream буферизация выключается. В противном случае вызов setbuf приведет к тем же действиям, что и вызов (void) setvbuf (stream, buf, _IOFBF, BUFSIZ).
B1.2. Форматный вывод
Функции printf осуществляют вывод информации по формату.
int fprintf(FILE *stream, const char *format, . );
fprintf преобразует и пишет вывод в поток stream под управлением format. Возвращаемое значение — число записанных символов или, в случае ошибки, отрицательное значение.
Форматная строка содержит два вида объектов: обычные символы, копируемые в выводной поток, и спецификации преобразования, которые вызывают преобразование и печать остальных аргументов в том порядке, как они перечислены. Каждая спецификация преобразования начинается с % и заканчивается символом-спецификатором преобразования. Между % и символом-спецификатором в порядке, в котором они здесь перечислены, могут быть расположены следующие элементы информации:
-
Флаги (в любом порядке), модифицирующие спецификацию:
– указывает на то, что преобразованный аргумент должен быть прижат к левому краю поля; + предписывает печатать число всегда со знаком; пробел если первый символ — не знак, то числу должен предшествовать пробел; 0 указывает, что числа должны дополняться слева нулями до всей ширины поля; # указывает на одну из следующих форм вывода: для o первой цифрой должен быть 0; для x или X ненулевому результату должны предшествовать 0x или 0X; для e, E, f, g и G вывод должен обязательно содержать десятичную точку; для g и G завершающие нули не отбрасываются. Ширина, или точность, или обе эти характеристики могут быть специфицированы с помощью *; в этом случае необходимое число извлекается из следующего аргумента, который должен иметь тип int (в случае двух звездочек используются два аргумента).
Символы-спецификаторы и разъяснение их смысла приведены в таблице B-1. Если за % нет правильного символа-спецификатора, результат не определен.
Таблица B-1. Преобразования printf
Символ Тип аргумента; вид печати d , i int ; знаковая десятичная запись o int ; беззнаковая восьмеричная запись (без 0 слева) x , X unsigned int ; беззнаковая шестнадцатеричная запись (без 0x или 0X слева), для шестнадцатиричных цифр от 10 до 15 используются символы a , b , c , d , e , f для x и A , B , C , D , E , F для X u int ; беззнаковое десятичное целое c int ; одиночный символ после преобразования в unsigned char s char * ; печатает символы строки, пока не встретится символ \0 , или не исчерпается количество символов, заданное точностью f double ; десятичная запись вида [–] mmm.ddd, где количество цифр d задается точностью (по умолчанию равно 6); нулевая точность подавляет печать десяичной точки e , E double ; десятичная запись вида [–] m.dddddd e + xx или [–] m.dddddd E + xx, где количество цифр d задается точностью (по умолчанию равно 6); нулевая точность подавляет печать десяичной точки g , G double ; использует %e или %E , если порядок меньше, чем –4, или больше или равен точности; в противном случае использует %f. Завершающие нули и завершающая десятичная точка не печатаются p void * ; печать указателя (представление зависит от реализации) n int * ; число символов, напечатанных к данному моменту данным вызовом printf , записывается в аргумент. Никакие другие аргументы не преобразуются % никакие аргументы не преобразуются; печатается % int printf(const char *format, . );
printf(. ) полностью эквивалентна fprintf(stdout, . ).
int sprintf(char *s, const char *format, . )
sprintf действует так же, как и printf, только вывод осуществляет в строку s, завершая ее символом '\0'. Строка s должна быть достаточно большой, чтобы вмещать результат вывода. Возвращает количество записанных символов, в число которых символ '\0' не входит.
int vprintf (const char *format, va_list arg) int vfprintf (FILE *stream, const char *format, va_list arg) int vsprintf (char *s, const char *format, va_list arg)
Функции vprintf, vfprintf и vsprintf эквивалентны соответствующим printf-функциям с той лишь разницей, что переменный список аргументов представлен параметром arg, инициализированным макросом va_start и, возможно, вызовами va_arg (см. в B7 описание ).
B1.3. Форматный ввод
Функции scanf имеют дело с форматным преобразованием при вводе
int fscanf(FILE *stream, const char *format, . );
fscanf читает данные из потока stream под управлением format и преобразованные величины присваивает по порядку аргументам, каждый из которых должен быть указателем. Завершает работу, если исчерпался формат. Выдает EOF по исчерпании файла или перед любым преобразованием, если возникла ошибка; в остальных случаях функция возвращает количество преобразованных и введенных элементов.
Форматная строка обычно содержит спецификации преобразования, которые используются для управления вводом. В форматную строку могут входить:
- пробелы и табуляции, которые игнорируются;
- обычные символы (кроме %), которые ожидаются в потоке ввода среди символов, отличных от символов-разделителей;
- спецификации преобразования, состоящие из %; необязательного знака *, подавляющего присваивание; необязательного числа, специфицирующего максимальную ширину поля; необязательных h, l или L, указывающих размер присваиваемого значения, и символа-спецификатора преобразования.
Спецификация преобразования определяет преобразование следующего поля ввода. Обычно результат размещается в переменной, на которую указывает соответствующий аргумент. Однако если присваивание подавляется с помощью знака *, как, например, в %*s , то поле ввода просто пропускается, и никакого присваивания не происходят. Поле ввода определяется как строка символов, отличных от символов-разделителей; при этом ввод строки прекращается при выполнении любого из двух условий: если встретился символ-разделитель или если ширина поля (в случае, когда она указана) исчерпана. Из этого следует, что при переходе к следующему полю scanf может «перешагивать» через границы строк, поскольку символ новой строки является символом-разделителем. (Под символами-разделителями понимаются символы пробела, табуляции, новой строки, возврата каретки, вертикальной табуляции и смены страницы.)
Символ-спецификатор указывает на способ интерпретации поля ввода. Соответствующий аргумент должен быть указателем. Список допустимых символов-спецификаторов приводится в таблице B-2.
Таблица B-2. Преобразования scanf
Символ Вводимые данные; тип аргумента d десятичное целое; int * i целое; int * . Число может быть восьмеричным (с 0 слева) или шестнадцатеричным (с 0x или 0X слева) o восьмеричное целое (с нулем слева или без него); int * u беззнаковое десятичное целое; unsigned int * x шестнадцатеричное целое (с 0x или 0X слева или без них); int * c символы; char * . Следующие символы из входного потока в количестве, заданном шириной поля (по умолчанию один), размещаются в указанном массиве. Символ '\0' не добавляется. Символы-разделители рассматриваются как обычные символы и помещаются в аргумент. Чтобы прочесть очередной символ, отличный от символа-разделителя, используйте спецификацию %1s s строка символов, отличных от символов-разделителей (без обрамляющих кавычек); char * , указывающий на массив символов, достаточный для хранения строки и завершающего символа '\0' , который будет добавлен автоматически e , f , g число с плавающей точкой; float *. Формат ввода для float состоит из необязательного знака, строки цифр, возможно с десятичной точкой, и необязательного порядка, состоящего из E или e и целого, возможно со знаком. p значение указателя в том виде, в котором его печатает printf("%p"); void * n записывает в аргумент число символов, прочитанных к данному моменту в этом вызове функции; int * . Никакого чтения из входного потока не происходит. Счетчик числа введенных элементов не увеличивается [. ] выбирает из ввода самую длинную непустую строку, состоящую из символов, заданных в квадратных скобках; char * . В конец строки добавляется ‘\0’ . Спецификатор вида []. ] включает ] в задаваемое множество символов [^. ] выбирает из ввода самую длинную непустую строку, состоящую из символов не входящих в заданное в скобках множество. В конец строки добавляется ‘\0’ . Спецификатор вида [^]. ] включает ] в задаваемое множество символов % обычный символ % , никакое присваивание не выполняется Символам-спецификаторам d, i, n, o, u и x может предшествовать h, если аргумент есть указатель на short (а не int) или l, если аргумент есть указатель на long. Символам-спецификаторам e, f и g может предшествовать l, если аргумент — указатель на double (а не float), или L, если аргумент — указатель на long double.
int scanf (const char *format, . );
scanf(. ) делает то же, что и fscanf(stdin, . ).
int sscanf (const char *s, const char *format, . );
sscanf(s, . ) делает то же, что и scanf(. ), только ввод символов осуществляет из строки s.
B1.4. Функции ввода-вывода символов
int fgetc(FILE *stream);
fgetc возвращает следующий символ из потока stream в виде unsigned char (переведенную в int) или EOF, если исчерпан файл или обнаружена ошибка.
char *fgets(char *s, int n, FILE *stream);
fgets читает не более n–1 символов в массив s, прекращая чтение, если встретился символ новой строки, который включается в массив; кроме того, записывает в массив '\0'. Функция fgets возвращает s или, если исчерпан файл или обнаружена ошибка, NULL.
int fputc(int с, FILE *stream);
fputc пишет символ c (переведенный в unsigned char) в stream. Возвращает записанный символ или EOF в случае ошибки.
int fputs(const char *s, FILE *stream);
fputs пишет строку s (в которой может отсутствовать символ '\n') в stream; возвращает неотрицательное целое или EOF в случае ошибки.
int getc(FILE *stream);
getc делает то же, что и fgetc, но в отличие от последней, если она — макрос, stream может браться более одного раза.
int getchar(void);
getchar() делает то же, что getc(stdin).
char *gets(char *s);
gets читает следующую строку ввода в массив s, заменяя символ новой строки на '\0'. Возвращает s или, если исчерпан файл или обнаружена ошибка, NULL .
int putc(int с, FILE *stream);
putc делает то же, что и fputc, но в отличие от последней, если putc — макрос, значение stream может браться более одного раза.
int putchar(int c);
putchar(c) делает тоже, что putc(c, stdout).
int puts(const char *s);
puts пишет строку s и символ новой строки в stdout. Возвращает EOF в случае ошибки, или неотрицательное значение, если запись прошла нормально.
int ungetc(int с, FILE *stream);
ungetc отправляет символ c (переведенный в unsigned char) обратно в stream; при следующем чтении из stream он будет получен снова. Для каждого потока вернуть можно не более одного символа. Нельзя возвращать EOF. В качестве результата ungetc выдает отправленный назад символ или, в случае ошибки, EOF.
B1.5. Функции прямого ввода-вывода
size_t fread(void *ptr, size_t size, size_t nobj, FILE *stream);
fread читает из потока stream в массив ptr не более nobj объектов размера size. Она возвращает количество прочитанных объектов, которое может быть меньше заявленного. Для индикации состояния после чтения следует использовать feof и ferror.
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *stream);
fwrite пишет из массива ptr в stream nobj объектов размера size; возвращает число записанных объектов, которое в случае ошибки меньше nobj.
B1.6. Функции позиционирования файла
int fseek(FILE *stream, long offset, int origin);
fseek устанавливает позицию для stream; последующее чтение или запись будет производиться с этой позиции. В случае бинарного файла позиция устанавливается со смещением offset — относительно начала, если origin равен SEEK_SET; относительно текущей позиции, если origin равен SEEK_CUR; и относительно конца файла, если origin равен SEEK_END. Для текстового файла offset должен быть нулем или значением, полученным с помощью вызова функции ftell. При работе с текстовым файлом origin всегда должен быть равен SEEK_SET.
long ftell(FILE *stream);
ftell возвращает текущую позицию потока stream или –1L, в случае ошибки.
void rewind(FILE *stream);
rewind(fp) делает то же, что и fseek(fp, 0L, SEEK_SET); clearerr(fp).
int fgetpos(FILE *stream, fpos_t *ptr);
fgetpos записывает текущую позицию потока stream в *ptr для последующего использования ее в fsetpos. Тип fpos_t позволяет хранить значения такого рода. В случае ошибки fgetpos возвращает ненулевое значение.
int fsetpos(FILE *stream, const fpos_t *ptr);
fsetpos устанавливает позицию в stream, читая ее из *ptr, куда она была записана ранее с помощью fgetpos. В случае ошибки fsetpos возвращает ненулевое значение.
B1.7. Функции обработки ошибок
Многие функции библиотеки в случае ошибки или конца файла устанавливают индикаторы состояния. Эти индикаторы можно проверять и изменять. Кроме того, целое выражение errno (объявленное в ) может содержать номер ошибки, который дает дополнительную информацию о последней из обнаруженных ошибок.
void clearerr(FILE *stream);
clearerr очищает индикаторы конца файла и ошибки потока stream.
int feof(FILE *stream);
feof возвращает ненулевое значение, если для потока stream установлен индикатор конца файла.
int ferror(FILE *stream);
ferror возвращает ненулевое значение, если для потока stream установлен индикатор ошибки.
void perror(const char *s);
perror(s) печатает s и зависимое от реализации сообщение об ошибке, соответствующее целому значению в errno, т.е. делает то же, что и обращение к функции fprintf вида
fprintf(stderr, "%s: %s\n", s, "сообщение об ошибке");