Namespaces
Variants

std:: fsetpos

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

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

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

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

Содержание

Параметры

stream - файловый поток для изменения
pos - указатель на объект fpos_t полученный с помощью std::fgetpos вызванного на потоке, связанном с тем же файлом

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

0 при успешном выполнении, ненулевое значение в противном случае. Также устанавливает errno при ошибке.

Примечания

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

Пример

#include <cstdio>
#include <cstdlib>
int main()
{
    // Подготовить массив значений с плавающей точкой.
    const int SIZE = 5;
    double A[SIZE] = {1., 2., 3., 4., 5.};
    // Записать массив в файл.
    std::FILE * fp = std::fopen("test.bin", "wb");
    std::fwrite(A, sizeof(double), SIZE, fp);
    std::fclose(fp);
    // Прочитать значения в массив B.
    double B[SIZE];
    fp = std::fopen("test.bin", "rb");
    std::fpos_t pos;
    if (std::fgetpos(fp, &pos) != 0)      // текущая позиция: начало файла
    {
       std::perror("fgetpos()");
       std::fprintf(stderr, "fgetpos() failed in file %s at line # %d\n",
                    __FILE__, __LINE__-3);
       std::exit(EXIT_FAILURE);
    }
    int ret_code = std::fread(B, sizeof(double), 1, fp);      // прочитать одно значение
    // текущая позиция: после чтения одного значения
    std::printf("%.1f; read count = %d\n", B[0], ret_code);   // вывести одно значение и ret_code
    if (std::fsetpos(fp, &pos) != 0)   // сбросить текущую позицию на начало файла
    {
       if (std::ferror(fp))
       {
          std::perror("fsetpos()");
          std::fprintf(stderr, "fsetpos() failed in file %s at line # %d\n",
                       __FILE__, __LINE__-5);
          std::exit(EXIT_FAILURE);
       }
    }
    ret_code = std::fread(B, sizeof(double), 1, fp);         // перечитать первое значение
    std::printf("%.1f; read count = %d\n", B[0], ret_code);  // вывести одно значение и ret_code
    std::fclose(fp);
    return EXIT_SUCCESS; 
}

Вывод:

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

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

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