fseek
Определено в заголовке <stdio.h> | ||
|---|---|---|
int fseek( FILE *stream, long offset, int origin ); | ||
#define SEEK_SET /*unspecified*/ #define SEEK_CUR /*unspecified*/ #define SEEK_END /*unspecified*/ |
Устанавливает указатель позиции файла для потока файла stream на значение, указанное offset.
Если поток stream открыт в двоичном режиме, новая позиция равна ровно offset байтам, отсчитанным от начала файла, если origin имеет значение SEEK_SET, от текущей позиции файла, если origin имеет значение SEEK_CUR, и от конца файла, если origin имеет значение SEEK_END. Двоичные потоки не обязаны поддерживать SEEK_END, особенно если выводятся дополнительные нулевые байты.
Если поток stream открыт в текстовом режиме, единственные поддерживаемые значения для offset — это ноль (что работает с любым origin) и значение, возвращённое предыдущим вызовом ftell для потока, связанного с тем же файлом (что работает только с origin типа SEEK_SET).
Если поток stream ориентирован на широкие символы, действуют ограничения как для текстовых, так и для двоичных потоков (результат вызова ftell разрешён при SEEK_SET, и смещение ноль разрешено от SEEK_SET и SEEK_CUR, но не SEEK_END).
Помимо изменения указателя позиции файла, fseek отменяет действие ungetc и очищает состояние конца файла, если применимо.
Если произошла ошибка чтения или записи, устанавливается индикатор ошибки для потока (ferror), а позиция файла остаётся без изменений.
Параметры
| stream | - | поток файла для изменения |
| offset | - | число символов для смещения позиции относительно начала |
| origin | - | позиция, к которой добавляется offset. Она может принимать одно из следующих значений: SEEK_SET, SEEK_CUR, SEEK_END |
Возвращаемое значение
0 при успешном выполнении, ненулевое значение в противном случае.
Примечания
После перехода к позиции, отличной от конца, в широком потоке, следующий вызов любой функции вывода может сделать остаток файла неопределённым, например, выведя последовательность многобайтовых символов другой длины.
Для текстовых потоков единственные допустимые значения offset — это 0 (применимо к любому origin) и значение, возвращённое предыдущим вызовом ftell (применимо только к SEEK_SET).
POSIX разрешает перейти к позиции за пределами существующего конца файла. Если после этого перехода выполняется вывод, любое чтение из этого промежутка вернёт нулевое количество байтов. В тех случаях, когда это поддерживается файловой системой, это создаёт разреженный файл.
POSIX также требует, чтобы fseek сначала выполнила fflush, если есть не записанные данные (но восстанавливается ли состояние смещения — определяется реализацией).
Пример
fseek с проверкой на ошибки:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
/* Prepare an array of double values. */
#define SIZE 5
double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0};
/* Write array to a file. */
FILE * fp = fopen("test.bin", "wb");
fwrite(A, sizeof(double), SIZE, fp);
fclose (fp);
/* Read the double values into array B. */
double B[SIZE];
fp = fopen("test.bin", "rb");
/* Set the file position indicator in front of third double value. */
if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0)
{
fprintf(stderr, "fseek() failed in file %s at line # %d\n", __FILE__, __LINE__ - 2);
fclose(fp);
return EXIT_FAILURE;
}
int ret_code = fread(B, sizeof(double), 1, fp); /* read one double value */
printf("ret_code == %d\n", ret_code); /* print the number of values read */
printf("B[0] == %.1f\n", B[0]); /* print one value */
fclose(fp);
return EXIT_SUCCESS;
}Возможный вывод:
ret_code == 1 B[0] == 3.0
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.21.9.2 Функция fseek (с. 245)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.21.9.2 Функция fseek (с. 336-337)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.19.9.2 Функция fseek (с. 302-303)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.9.9.2 Функция fseek
См. также
| перемещает указатель позиции файла в определённое место в файле (функция) |
|
| получает указатель позиции файла (функция) |
|
| возвращает текущий указатель позиции файла (функция) |
|
| перемещает указатель позиции файла в начало файла (функция) |
|
Документация C++ для fseek |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/io/fseek