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

Пример

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

См. также

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

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

Spec-Zone.ru

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