Изменить текущую позицию указателя положения в потоке
#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 );
SEEK_CUR
с offset, равным 0
, необходим, если нужно переключиться с чтения на запись в потоке, открытом для обновления. libc
Функции fseek(), fseeko() и fseeko64() изменяют текующую позицию в потоке, определяемом fp. Эта позиция определяет символ, который будет считан или записан при следующей операции ввода/вывода в поток. Разница в функциях в типе данных аргумента offset.
Данные функции очищают признак конца файла и отменяют все эффекты функции ungetc() для потока.
Можно использовать ftell*() для получения текущей позиции в потоке перед ее изменением. Можно также восстановить позицию, используя значение, возвращенное одной из функций ftell(), при последующем вызове функции fseek() передав ей в качестве аргумента whence значение SEEK_SET
.
Данные функции завершаются с ошибкой в случаях, если поток не буферизирован, если буфер потока нуждается в сбросе и если вызов fseek(), fseeko() или fseeko64() приводит к вызову lseek() или write():
O_NONBLOCK
установлен для файлового дескриптора fp, и операция записи для процесса будет отложена. TOSTOP
установлен, процесс ни игнорирует, ни блокирует SIGTTOU
, группа процеса является осиротевшей. long
. off_t
. SIGPIPE
. Определить размер файла, сохранив и восстановив текущую позицию в файле:
#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 системной библиотеки