Namespaces
Variants

fseek

From cppreference.net
< c ‎ | io
Определено в заголовочном файле <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 , особенно если выводятся дополнительные нулевые байты.

Если поток открыт в текстовом режиме, единственными поддерживаемыми значениями для 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