146
#include <stdio.h>
int fseek (FILE *stream, long offset,
int whence);
long ftell (FILE *stream);
off_t ftello (FILE *stream);
int fgetpos (FILE *restrict stream,
fpos_t *restrict pos);
int fsetpos (FILE *stream, const fpos_t *pos);
void rewind (FILE *stream);
Листинг 5.20. Описание функций lseek(), fseek(), ftell(), ftello(),
fgetpos(), fsetpos(), rewind().
Функция lseek() устанавливает индикатор текущей позиции
следующим образом. Сначала, в зависимости от значения третьего
аргумента, whence, выбирается точка отсчета: 0, если это значение равно
SEEK_SET, текущая позиция для SEEK_CUR и размер файла для
SEEK_END. Затем к точке отсчета прибавляется смещение offset (второй
аргумент).
Индикатор текущей позиции можно сместить за конец файла
(причем его размер не изменится). Если с этой позиции будет
произведена запись, в файле образуется дыра, чтение из которой выдает
нулевые байты.
Результатом функции lseek() служит новое значение индикатора
текущей позиции, отсчитанное в байтах от начала файла. В случае
ошибки возвращается (off_t) (-1), а текущая позиция остается прежней.
Функция fseek() по сути аналогична, только в случае нормального
завершения возвращается 0. Кроме того, если поток имеет широкую
ориентацию, значение аргумента whence должно равняться SEEK_SET, а
значение offset – нулю или результату вызова функции ftell() для того же
потока.
Функция ftell() возвращает значение индикатора текущей позиции
для заданного потока (в случае ошибки – (long) (-1)). Функция ftello()
эквивалентна ftell() с точностью до типа результата; в новых
приложениях рекомендуется использовать ftello(), так как эта функция
применима к большим файлам.
Функции fgetpos() и fsetpos() являются парными. Первая из них
заполняет структуру, на которую указывает аргумент pos, а вторая
применяет ее для установки индикатора текущей позиции. Нормальным
результатом служит 0.
Функция rewind(), если пренебречь некоторыми тонкостями,
сводится к вызову
(void) fseek (stream, 0L, SEEK_SET).
Приведем несколько примеров. В листинге 5.21 показана
установка индикатора текущей позиции в начало и конец файла, а также
его (индикатора) приращение.
(void) lseek (fildes, (off_t) 0, SEEK_SET);