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.
Требования
Function | Обязательный заголовок |
---|---|
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