Spec-Zone.ru › C

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, если имеются какие-либо незаписанные данные (однако восстановление состояния сдвига определяется реализацией).

Согласно POSIX, fseek должна возвращать -1 в случае ошибки и устанавливать errno для указания на ошибку.

В Windows для работы с файлами размером более 2 ГиБ можно использовать _fseeki64.

Пример

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); // reads one double value
    printf("ret_code == %d\n", ret_code);           // prints the number of values read
    printf("B[0] == %.1f\n", B[0]);                 // prints one value

    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

См. также

fsetpos
перемещает индикатор позиции в файле в заданное место
(функция)
fgetpos
получает индикатор позиции в файле
(функция)
ftell
возвращает текущий индикатор позиции в файле
(функция)
rewind
перемещает индикатор позиции в файле в начало файла
(функция)
Документация C++ для fseek

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/io/fseek

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API