fseek
|
Определено в заголовочном файле
<stdio.h>
|
||
|
int
fseek
(
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
|
#define SEEK_SET /* unspecified */
#define SEEK_CUR /* unspecified */
|
||
Устанавливает индикатор позиции в файле для файлового потока stream на значение, на которое указывает offset .
Если stream открыт в бинарном режиме, новая позиция точно равна offset байтам, отсчитываемым от начала файла, если origin равен SEEK_SET , от текущей позиции файла, если origin равен SEEK_CUR , и от конца файла, если origin равен SEEK_END . Бинарные потоки не обязаны поддерживать SEEK_END , особенно если выводятся дополнительные нулевые байты.
Если поток открыт в текстовом режиме, единственными поддерживаемыми значениями для 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
при наличии любых не записанных данных (однако восстановление состояния сдвига определяется реализацией).
POSIX указывает, что
fseek
должен возвращать
-
1
при ошибке и устанавливать
errno
для указания типа ошибки.
В Windows,
_fseeki64
может использоваться для работы с файлами размером более 2 ГБ.
Пример
fseek
с проверкой ошибок:
#include <stdio.h> #include <stdlib.h> int main(void) { // Подготавливаем массив значений double. #define SIZE 5 double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0}; // Записываем массив в файл. FILE * fp = fopen("test.bin", "wb"); fwrite(A, sizeof(double), SIZE, fp); fclose (fp); // Считываем значения double в массив B. double B[SIZE]; fp = fopen("test.bin", "rb"); // Устанавливаем индикатор позиции файла перед третьим значением double. 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); // считывает одно значение double printf("ret_code == %d\n", ret_code); // выводит количество считанных значений printf("B[0] == %.1f\n", B[0]); // выводит одно значение fclose(fp); return EXIT_SUCCESS; }
Возможный вывод:
ret_code == 1 B[0] == 3.0
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.23.9.2 Функция fseek (стр.: TBD)
- Стандарт 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++ documentation
для
fseek
|
|