Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
stdio_ВАНЯ.rtf
Скачиваний:
5
Добавлен:
20.07.2019
Размер:
588.72 Кб
Скачать

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 применяется для контроля достижения конца потока ввода. Спецификация формата ее вызова имеет вид:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]