Функции семейства scanf
EOF. Если в файловом потоке возникает ошибка чтения, устанавливается флаг ошибки потока и тип ошибки задается в переменной errno. Более подробную информациюФункция scanf
□ традиционно их реализации полны ошибок;
□ в использовании эти функции не гибки;
□
они могут привести к созданию программного кода, в котором трудно решить, что подвергать синтаксическому анализу.В качестве альтернативы попытайтесь применять другие функции, такие как fread
fgets, для чтения строк ввода, а затем воспользуйтесь строковыми функциями для разделения введенной строки на нужные элементы.Другие потоковые функции
В библиотеке stdio существует ряд других функций, использующих потоки как параметры или стандартные потоки stdin
stdout, stderr:□ fgetpos
□ fsetpos
□ ftell
□ rewind
□ freopen
□ setvbuf
□ remove
unlink, до тех пор пока параметр path не является каталогом, в этом случае она эквивалентна функции rmdir.Эти библиотечные функции описаны на страницах интерактивного справочного руководства в разделе 3.
Вы можете использовать функции обработки файловых потоков для повторной реализации с их помощью программы копирования файлов. Взгляните на программу copy_stdio.c в упражнении 3.3.
Эта программа очень похожа на предыдущие версии, но посимвольное копирование выполняется с помощью вызовов функций, заданных в файле stdio.h:
#include
#include
int main() {
int c;
FILE *in, *out;
in = fopen("file.in", "r");
out = fopen("file.out", "w");
while((c = fgetc(in)) != EOF) fputc(c, out);
exit(0);
}
Выполнив эту программу, как прежде, вы получите:
$ TIMEFORMAT="" time ./copy_stdio
0.06user 0.02system 0:00.11elapsed 81%CPU
Как это работает
На этот раз программа выполняется 0,11 с, не так быстро, как низкоуровневая блочная версия, но значительно быстрее другой посимвольной версии. Это произошло потому, что библиотека stdio поддерживает внутренний буфер в структуре FILE
Ошибки потока
Для обозначения ошибок многие функции библиотеки stdio применяют значения за пределами допустимых, например, пустые указатели или константу EOF
errno.#include
extern int errno;
Имейте в виду, что многие функции могут изменять значение errno
fprintf, могут сами изменять errno.Вы можете также запросить состояние файлового потока, чтобы выяснить, возникла ли ошибка или достигнут конец файла.
#include
int ferror(FILE *stream);
int feof(FILE *stream);
void clearerr(FILE *stream);
Функция ferror
Функция feof
if (feof(some_stream))
/* Мы в конце */