fseek(), fseeko(), fseeko64()

Изменить текущую позицию указателя положения в потоке

Прототип:

#include <stdio.h>
int fseek( FILE *fp,
long offset,
int whence );
int fseeko( FILE *fp,
off_t offset,
int whence );
int fseeko64( FILE *fp,
off64_t offset,
int whence );

Аргументы:

fp
Указатель на FILE, возвращаемый fopen() или freopen().
offset
Дистанция перемещения относительно одной из позиций, определяемых whence.
whence
Позиция, от которой считается смещение; может быть одним из следующих значений:
SEEK_SET
Считать новую позицию в файле относительно начала файла. Значение offset не должно быть отрицательным.
SEEK_CUR
Считать новую позицию в файле относительно текущей позиции. Значение offset может быть положительным, отрицательным или нулевым. SEEK_CUR с offset, равным 0, необходим, если нужно переключиться с чтения на запись в потоке, открытом для обновления.
SEEK_END
Считать новую позицию в файле относительно конца файла.

Библиотека:

libc

Описание:

Функции fseek(), fseeko() и fseeko64() изменяют текующую позицию в потоке, определяемом fp. Эта позиция определяет символ, который будет считан или записан при следующей операции ввода/вывода в поток. Разница в функциях в типе данных аргумента offset.

Данные функции очищают признак конца файла и отменяют все эффекты функции ungetc() для потока.

Можно использовать ftell*() для получения текущей позиции в потоке перед ее изменением. Можно также восстановить позицию, используя значение, возвращенное одной из функций ftell(), при последующем вызове функции fseek() передав ей в качестве аргумента whence значение SEEK_SET.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

Данные функции завершаются с ошибкой в случаях, если поток не буферизирован, если буфер потока нуждается в сбросе и если вызов fseek(), fseeko() или fseeko64() приводит к вызову lseek() или write():

EAGAIN
Флаг O_NONBLOCK установлен для файлового дескриптора fp, и операция записи для процесса будет отложена.
EBADF
Файловый дескриптор потокового файла не открыт для записи или потоковый буфер нуждается в сбросе и файл не открыт.
EFBIG
Одна из следующих причин:
EINTR
Операция записи была прервана пришедшим сигналом; данные не были переданы.
EINVAL
Аргумент whence некорректен. Результирующий индикатор файловой позиции устанавливается в отрицательное значение.
EIO
Одна из следующих причин:
ENOSPC
На устройстве, содержащем файл, не осталось свободного места.
ENXIO
Запрос был сделан от лица несуществующего устройства, либо запрос лежит вне возможностей устройства.
EOVERFLOW
EPIPE
Попытка записи в канал или FIFO, которые не были открыты для чтения никаким процессом. Потоку также отправляется сигнал SIGPIPE.
ESPIPE
Файловый дескриптор потока ассоциирован с каналом или FIFO.
ENOSYS
Устройство не поддерживает функцию поиска.

Примеры:

Определить размер файла, сохранив и восстановив текущую позицию в файле:

#include <stdio.h>
#include <stdlib.h>
long filesize( FILE *fp )
{
long int save_pos;
long size_of_file;
/* Save the current position. */
save_pos = ftell( fp );
/* Jump to the end of the file. */
fseek( fp, 0L, SEEK_END );
/* Get the end position. */
size_of_file = ftell( fp );
/* Jump back to the original position. */
fseek( fp, save_pos, SEEK_SET );
return (size_of_file);
}
int main( void )
{
FILE *fp;
fp = fopen( "file", "r" );
if ( fp != NULL )
{
printf( "File size=%ld\n", filesize( fp ) );
fclose( fp );
return (EXIT_SUCCESS);
}
return (EXIT_FAILURE);
}

Классификация:

fseek() — ANSI, POSIX 1003.1; fseeko() — POSIX 1003.1; fseeko64() — Поддержка больших файлов

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

errno, fgetpos(), fopen(), fsetpos(), ftell(), ftello(), ftello64()




Предыдущий раздел: Описание API системной библиотеки