fseek, _fseeki64

Перемещает файловый указатель в указанное местоположение.

Синтаксис

int fseek(
   FILE *stream,
   long offset,
   int origin
);
int _fseeki64(
   FILE *stream,
   __int64 offset,
   int origin
);

Параметры

stream
Указатель на структуру FILE .

offset
Количество байт начиная с origin.

origin
Первоначальная позиция.

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

Если операция завершилась удачно, fseek и _fseeki64 возвращают 0. В противном случае возвращается ненулевое значение. Для устройств, которые не поддерживают поиск, возвращаемое значение не определено. Если stream имеет значение NULL или origin не является одним из разрешенных значений, описанных ниже, fseek и _fseeki64 вызовите обработчик недопустимых параметров, как описано в разделе проверки параметров. Если продолжение выполнения разрешено, эти функции устанавливают для errno значение EINVAL и возвращают -1.

Замечания

И fseek функции перемещают указатель файла (при наличии), связанный с stream новым расположением, offset из байтовorigin._fseeki64 Следующая операция в потоке происходит в новом местоположении. В потоке, открытом для обновления, следующая операция может быть либо операцией чтения, либо операцией записи. Аргумент origin должен быть одним из следующих констант, определенных в STDIO.H:

Значение источника Значение
SEEK_CUR Текущая позиция файлового указателя.
SEEK_END Конец файла.
SEEK_SET Начало файла.

С помощью функций fseek и _fseeki64 можно переместить указатель в любое место в файле. Указатель также может быть размещен за пределами файла. fseekи _fseeki64 очищает индикатор конца файла и отрицает влияние любых предыдущих ungetc вызовов.stream

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

Для потоков, открытых в текстовом режиме, и _fseeki64 имеют ограниченное использование, fseek так как переводы веб-канала возврата каретки могут вызывать fseek и _fseeki64 создавать непредвиденные результаты. Единственными fseek и _fseeki64 операциями, гарантированно работающими в потоках, открытых в текстовом режиме, являются:

  • поиск со смещением 0 относительно любого из значений origin;

  • Поиск с начала файла со значением смещения, возвращаемым из вызова ftell при использовании fseek или _ftelli64 при использовании _fseeki64.

Кроме того, в текстовом режиме при вводе CTRL+Z интерпретируется как символ конца файла. В файлах, открытых для чтения/записи, функция fopen и все связанные с ней подпрограммы проверяют наличие символа CTRL+Z в конце файла и удаляют его, если это возможно. Он удаляется из-за того, что при использовании сочетания fseek и ftell (или _fseeki64 ) _ftelli64перемещение в файл, заканчивающийся сочетанием КЛАВИШ CTRL+Z, может привести fseek к _fseeki64 неправильному ведении в конце файла.

Когда CRT открывает файл, начинающийся с метки порядка байтов (BOM), указатель на файл размещается после BOM. (То есть он расположен в начале фактического содержимого файла). Если вы должны быть fseek в начале файла, используйте ftell для получения начальной позиции, а затем fseek для этой позиции, а не для позиции 0.

Эта функция блокирует работу других потоков во время выполнения, поэтому она потокобезопасна. Сведения о версии, отличной от блокировки, см. в статье _fseek_nolock. _fseeki64_nolock

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.

Требования

Функция Обязательный заголовок
fseek <stdio.h>
_fseeki64 <stdio.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

// crt_fseek.c
// This program opens the file FSEEK.OUT and
// moves the pointer to the file's beginning.

#include <stdio.h>

int main( void )
{
   FILE *stream;
   char line[81];
   int  result;

   if ( fopen_s( &stream, "fseek.out", "w+" ) != 0 )
   {
      printf( "The file fseek.out was not opened\n" );
      return -1;
   }
   fprintf( stream, "The fseek begins here: "
                    "This is the file 'fseek.out'.\n" );
   result = fseek( stream, 23L, SEEK_SET);
   if( result )
      perror( "Fseek failed" );
   else
   {
      printf( "File pointer is set to middle of first line.\n" );
      fgets( line, 80, stream );
      printf( "%s", line );
    }
   fclose( stream );
}
File pointer is set to middle of first line.
This is the file 'fseek.out'.

См. также

Потоковый ввод-вывод
fopen, _wfopen
ftell, _ftelli64
_lseek, _lseeki64
rewind