Поделиться через


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 принимает пустой указатель или если origin не является одним из описанных ниже допустимых значений, fseek и _fseeki64 вызывают обработчик недопустимых параметров, как описано в разделе Проверка параметров. Если продолжение выполнения разрешено, эти функции устанавливают для errno значение EINVAL и возвращают -1.

Заметки

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

  • SEEK_CUR
    Текущая позиция указателя файла.

  • SEEK_END
    Конец файла.

  • SEEK_SET
    Начало файла.

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

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

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

  • Поиск со смещением 0 относительно любого значения origin.

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

Также в текстовом режиме CTRL+Z интерпретируется как символ конца файла на входе. В файлах, открытых для чтения или записи, fopen и все связанные процедуры проверяют наличие CTRL+Z в конце файла и удаляют его, если это возможно. Это делается потому, что использование комбинации fseek и ftellили_fseeki64 и _ftelli64 для перемещения в файле, который заканчивается CTRL+Z, может вызвать неправильное поведение fseek или _fseeki64 ближе к концу файла.

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

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

Требования

Функция

Обязательный заголовок

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 );
}
  

Эквивалент в .NET Framework

См. также

Ссылки

Потоковый ввод-вывод

fopen, _wfopen

ftell, _ftelli64

_lseek, _lseeki64

rewind