- •Стандартный буферизованный ввод-вывод Потоки ввода-вывода
- •Программный интерфейс потоков ввода-вывода
- •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);
Void rewind(file* stream);
Аргумент stream обозначает файловый поток, где нужно установить позицию ввода-вывода в начало файла. Функцию rewind можно рассматривать как частный вариант функции fseek, свободный от ошибок позиционирования в потоке ввода-вывода. Поэтому функция rewind не имеет кода возврата в отличие от универсальной функции позиционирования fseek.
Для эффективной буферизованной обработки больших файлов целесообразно выполнять смещение с помощью функции fseek относительно текущей позиции ввода-вывода, задавая аргумент whence значением константы SEEK_CUR. Когда аргумент whence функции fseek специфицирован значением SEEK_CUR, смещение, заданное параметром offset, исчисляется от текущей позиции в файле. Отрицательное значение параметра offset устанавливает смещение позиции ввода-вывода к началу файла, положительное ‑ концу файла.
Для сдвига относительно текущей позиции файла желательно иметь возможность ее определить. Такую возможность предоставляет функция ftell. Спецификация формата ее вызова имеет вид:
long ftell(FILE* stream);
Функция ftell возвращает смещение в байтах текущей позиции ввода-вывода относительно начала файла в потоке, который специфицирован аргументом stream. В случае ошибки измерения возвращается отрицательный код (-1L).
Использование функций fseek и ftell поясняет исходный код прикладной функции fsize, которая определяет текущий размер файла, открытого для потоковой обработки данных.
/* Определение размера файла */
long fsize(FILE* stream) {
long offset; /* текущее смещение указателя потока */
long size; /* размер файла */
/* Запомнить текущее смещение указателя потока */
offset = ftell(stream);
/* Установить указатель в конец потока */
fseek(stream, 0L, SEEK_END);
/* Определить размер файла по конечной позиции потока */
size = ftell(stream);
/* Восстановить исходное смещение указателя потока */
fseek(stream, offset, SEEK_SET);
/* Возврат величины размера файла */
return(size);
} /* fsize */
Принцип измерения длины файла, реализованный в функции fsize, основан на установке текущей позиции указателя потока в конец файла с помощью функции fseek. Тогда текущее смещение указателя, измеренное функцией ftell, будет равно искомой длине файла в байтах.
Анализ состояния потока ввода-вывода
Все функции буферизованной обработки данных устроены таким образом, что при достижении конца потока или ошибках ввода-вывода они устанавливают соответствующие битовые флаги состояния в структуре управления потоком. Это предоставляет возможность контролировать состояние потока в любой момент, пока он открыт для чтения или записи. Для контроля состояния потока предусмотрены три функции: feof, ferror и clearerr. Они реализованы как макросы в заголовочном файле <stdio.h> системы программирования C. Каждая из этих функций-макросов маскирует соответствующие битовые флаги в структуре управления потоком.
Функция feof применяется для контроля достижения конца потока ввода. Спецификация формата ее вызова имеет вид: