Namespaces
Variants

fsetpos

From cppreference.net
< c ‎ | io
Определено в заголовочном файле <stdio.h>
int fsetpos ( FILE * stream, const fpos_t * pos ) ;

Устанавливает индикатор позиции в файле и состояние разбора многобайтовых символов (если применимо) для файлового потока stream в соответствии со значением, на которое указывает pos .

Помимо установки нового состояния разбора и позиции, вызов этой функции отменяет эффекты ungetc и сбрасывает состояние конца файла, если оно установлено.

Если возникает ошибка чтения или записи, устанавливается индикатор ошибки ( ferror ) для потока.

Содержание

Параметры

stream - файловый поток для модификации
pos - указатель на объект fpos_t для использования в качестве нового значения индикатора позиции в файле

Возвращаемое значение

0 при успешном выполнении, иначе ненулевое значение.

Примечания

После перехода в неконечную позицию в широком потоке следующий вызов любой выходной функции может сделать оставшуюся часть файла неопределённой, например, выводя многобайтовую последовательность другой длины.

Пример

fsetpos с проверкой ошибок

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    // Подготовка массива значений с плавающей точкой.
    #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);
    // Чтение значений с плавающей точкой в массив B.
    double B[SIZE];
    fp = fopen("test.bin","rb");
    fpos_t pos;
    if (fgetpos(fp, &pos)) // текущая позиция: начало файла
    {
        perror("fgetpos()");
        fprintf(stderr, "fgetpos() failed in file %s at line # %d\n",
                __FILE__, __LINE__ - 3);
        exit(EXIT_FAILURE);
    }
    int ret_code = fread(B,sizeof(double),1,fp); // чтение одного значения с плавающей точкой
    // текущая позиция: после чтения одного значения с плавающей точкой
    printf("%.1f; read count = %d\n", B[0], ret_code); // вывод одного значения с плавающей точкой и ret_code
    if (fsetpos(fp, &pos)) // сброс текущей позиции на начало файла
    {
        if (ferror(fp))
        {
            perror("fsetpos()");
            fprintf(stderr, "fsetpos() failed in file %s at line # %d\n", __FILE__,
                    __LINE__ - 5);
            exit(EXIT_FAILURE);
        }
    }
    ret_code = fread(B, sizeof(double), 1, fp); // повторное чтение первого значения с плавающей точкой
    printf("%.1f; read count = %d\n", B[0], ret_code); // вывод одного значения с плавающей точкой и ret_code
    fclose(fp);
    return EXIT_SUCCESS;
}

Возможный вывод:

1.0; read count = 1
1.0; read count = 1

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.21.9.3 Функция fsetpos (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.21.9.3 Функция fsetpos (стр.: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.21.9.3 Функция fsetpos (стр. 337)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.19.9.3 Функция fsetpos (стр.: 303)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.9.9.3 Функция fsetpos

Смотрите также

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