Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Си_3.doc
Скачиваний:
3
Добавлен:
25.08.2019
Размер:
192 Кб
Скачать

Дополнительные возможности ввода-вывода данных

Анализ и управление положением указателя файла производится с помощью функций feof, fseek, rewind. При выполнении операций над записями файла позиционирование указателя производится с помощью функций fseek или rewind. Положение курсора в файле можно с помощью функции feof.

Прототип функции feof:

int feof (FILE* stream);

Возвращаемое значение функцией feof:

  • нуль, если конец файла не достигнут;

  • не нуль, если конец файла достигнут.

При чтении из файла с помощью функций fgets и fscanf признак конца файла формируется сразу после считывания последних данных файла. Поэтому в этих случаях конец файла можно обнаружить из анализа значения результата вызова функции feof.

Пример

while (! feof(fid)) { fgets (str, 50, fid ); …

Пример

while ( c = getc (fid)) ! =EOF) { …

Если с помощью fread из файла прочитана последняя запись и достигнут конец файла, то функция feof возвратит не нуль только после очередной попытки чтения из файла и сохранит его до тех пор, пока файл не будет закрыт или не будет вызвана функция rewind. Так как значение feof, не равное нулю, обнаруживается только после очередной неудачной попытки чтения из файла с помощью оператора fread, для обнаружения конца файла можно анализировать результат очередной попытки чтения из файла, то есть результат выполнения функции fread.

Пример

while ( fread(&st, RZ, 1,fr) ) { …

Функция fread возвратит результат, равный 1 только при успешном чтении и равный 0 при неуспешном чтении; в последнем случае условие заголовка цикла while станет ложным, выполнение цикла while завершится.

Для чтения или записи данных в заданное место файла используют функцию fseek, с помощью которой указатель устанавливается в заданное место файла.

Прототип функции fseek:

int fseek (FILE* stream, long offset, int nach);

где stream – указатель переменной типа FILE;

offset – смещение указателя в байтах относительно начала, заданного параметром nach;

nach – начальная точка, от которой производится смещение.

Возвращаемое значение функцией feof:

  • нуль, если конец файла не достигнут;

  • не нуль, если конец файла достигнут.

Функция fseek перемещает указатель файла, связанный с потоком stream на новое место, которое определяется значениями offset и nach. Следующая операция ввода-вывода будет выполнена, начиная с той позиции, на которую будет перемещён указатель. Параметр nach определяет начальную точку, от которой производится смещение, и может иметь значение одной из следующих констант, определённых в stdio.h:

SEEK_SET = 0; - от начала файла;

SEEK_CUR = 1; - от текущего положения указателя файла;

SEEK_END = 2; - от конца файла.

В качестве значения nach можно использовать имя предопределённой константы или её значение.

Параметр offset – целая константа со знаком; она определяет перемещение указателя на offset байтов вперёд (к концу файла, если offset > 0) или назад (к началу файла, если offset < 0) относительно начальной точки, определённой параметром nach.

Функция fseek может быть использована для перемещения указателя в любое место файла. Попытка перенести указатель за начало файла вызывает ошибку.

Возвращаемое значение функцией fseek:

  • нуль, если указатель перемещён успешно;

  • не нуль, если произошла ошибка.

Номера записей файла из N записей могут изменяться в пределах от 0 до N-1.

Пример Обращение к функции fseek

fseek(fr, 0L, 0); - на 0 байтов от начала файла;

fseek(fr, 10L, 0); - на 10 байтов от начала файла;

fseek(fr, 0L, 2);) – в конец файла;

fseek(fr, 100L, 1); - на 100 байтов от текущей позиции указателя; fseek(fr, -n, 1); - на n назад от текущей позиции указателя;

fseek(fr, -m, SEEK_CUR); - на m назад от текущей позиции указателя.

С помощью функции rewind можно установить указатель, связанный файлом, на начало файла.

Прототип функции rewind:

void rewind(FILE* stream);

где stream – указатель переменной типа FILE.

Вызов функции rewind: rewind(fr); эквивалентен вызову функции fseek(fr, 0L, SEEK_SET);.

Дополнительно к действию функции fseek функция rewind очищает признак конца файла и признак ошибки, а функция fseek не делает этого. Кроме того, функция fseek возвращает значение, которое определяет, успешно или неуспешно был перемещён указатель.

Текущее значение указателя текущей позиции в файле можно определить с помощью функции ftell.

Прототип функции ftell:

long int ftell (FILE* stream);

где stream – указатель переменной типа FILE.

Функция ftell возвращает текущее значение указателя текущей позиции в файле, связанном с указателем файла stream. При неудачном исходе функция ftell возвращает -1.

Замечание Функцию fseek надо использовать для текстового файла только в том случае, когда её аргументом будет значение, определённое с помощью функции ftell.

Замечание Файл, содержащий текст, можно открывать в бинарном режиме. Никакие ограничения, связанные с тем, что файл содержит текст, к операциям прямого доступа не относятся. Эти ограничения относятся только к файлам, открытым в текстовом режиме.

237