- •Стандартный буферизованный ввод-вывод Потоки ввода-вывода
- •Программный интерфейс потоков ввода-вывода
- •Int fprintf(file* stream, const char* format[, arg]...);
- •Форматный ввод
- •Int fscanf(file* stream, const char* format[, ptr]...);
- •Int fgetc(file* stream);
- •Int ungetc(int sym, file* stream);
- •Int fputc(int sym, file* stream);
- •Int fputs(const char* string, file* stream);
- •Int puts(const char* string);
- •Int fread(void* ptr, int size, int num, file* stream);
- •Int fwrite(const void* ptr, int size, int num, file* stream);
- •Int fflush(file* stream);
- •Int fseek(file* stream, long offset, int whence);
- •Void rewind(file* stream);
- •Int feof(file* stream);
- •Int ferror(file* stream);
- •Void perror(conts char* diag);
- •Void clearerr(file* stream);
- •Int fclose(file* stream);
Int feof(file* stream);
Функция feof проверяет индикатор конца потока в структуре управления, которую адресует указатель stream. Этот индикатор устанавливается, если достигнут конец потока. Функция feof возвращает целочисленное ненулевое значение, когда установлен индикатор конца потока. В противном случае, ее код возврата равен нулю.
Функция ferror применяется для контроля состояния ошибки ввода-вывода. Спецификация формата ее вызова имеет вид:
Int ferror(file* stream);
Функция ferror проверяет индикатор ошибки ввода-вывода в структуре управления потоком, которую адресует указатель stream. Этот индикатор устанавливается при ошибке ввода-вывода. Функция ferror всегда будет возвращать целочисленное ненулевое значение, пока установлен индикатор ошибки. В противном случае, ее код возврата равен нулю.
Функции feof и ferror следует использовать, если необходимо отличить конец потока от ошибки ввода-вывода, когда эти ситуации неразличимы по коду возврата контролируемой библиотечной функции чтения или записи. Например, функция getc возвращает значение EOF в конце потока ввода, также как при ошибке чтения данных. Чтобы одназначно классифицировать состояние потока в этом случае, достаточно вызвать функцию ferror или feof и проверить их код возврата.
Более общий способ контроля ошибок ввода-вывода предоставляет анализ значения внешней целочисленной переменной errno, которая сохраняет код последней ошибки, необязательно ввода-вывода. Коды ошибок индексируют системный массив диагностических сообщений, который адресует указатель sys_errlist. Для отображения диагностики ошибок может быть использована функция perror. Спецификация формата ее вызова имеет вид:
Void perror(conts char* diag);
Функция perror отображает диагностическое сообщение по текущей ошибке через стандартный поток stderr после информационной строки, адресуемой указателем diag. Информационную и диагностическую части вывода функции perror разделяют двоеточие и пробел. Отображение диагностики ошибки автоматически завершает символ перевода строки.
Следующий фрагмент исходного кода демонстрирует применение функции perror для диагностики ошибки, при аварийном завершении функции fopen:
FILE* stream;
if((stream = fopen("any.txt","r")) == NULL) {
perror("any.txt");
..................
} /* if */
Если файл any.txt, специфицированный при вызове функции fopen, не существует, то данный исходный код обеспечит вывод следующего сообщения:
any.txt: No such file or directory
При этом системная переменная errno примет значение 2.
В некоторых случаях перед обращением к функциям чтения-записи полезно проинициализировать флаги состояния в структуре управления потоком, используя функцию clearerr. Спецификация формата ее вызова имеет вид:
Void clearerr(file* stream);
Функция clearerr принудительно сбрасывает индикаторы конца потока и ошибки ввода-вывода для потока, адресуемого указателем stream. При этом гарантируется, что последующие вызовы функций feof и ferror вернут код, равный нулю, независимо от предыстории обработки потока.
Завершение обработки потока ввода-вывода
После выполнения всех необходимых операций буферизованного ввода-вывода следует корректно завершить обработку файлового потока вызовом функции fclose. Спецификация формата обращения к ней имеет вид: