Namespaces
Variants

std:: fseek

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

Устанавливает индикатор позиции в файле для файлового потока stream .

Если stream открыт в бинарном режиме, новая позиция составляет ровно offset байтов от начала файла, если origin равен SEEK_SET , от текущей позиции в файле, если origin равен SEEK_CUR , и от конца файла, если origin равен SEEK_END . Бинарные потоки не обязаны поддерживать SEEK_END , особенно если выводятся дополнительные нулевые байты.

Если поток открыт в текстовом режиме, единственными поддерживаемыми значениями для offset являются ноль (который работает с любым origin ) и значение, возвращённое предыдущим вызовом std::ftell для потока, связанного с тем же файлом (которое работает только с origin равным SEEK_SET ).

Если stream является широкоориентированным, применяются ограничения как текстовых, так и двоичных потоков (результат std::ftell разрешён с SEEK_SET и нулевое смещение разрешено от SEEK_SET и SEEK_CUR , но не SEEK_END ).

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

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

Содержание

Параметры

stream - файловый поток для модификации
offset - количество символов для смещения позиции относительно точки отсчета
origin - позиция, к которой добавляется offset . Может принимать одно из следующих значений: SEEK_SET , SEEK_CUR , SEEK_END

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

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

Примечания

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

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

POSIX также требует, чтобы fseek сначала выполнял fflush при наличии незаписанных данных (однако восстановление состояния сдвига определяется реализацией). Стандартные потоки файлов C++ гарантируют как сброс буфера, так и восстановление состояния: std::basic_filebuf::seekoff .

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

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

Пример

#include <cassert>
#include <cstdio>
#include <cstdint>
#include <fstream>
#include <vector>
int main()
{
    std::ofstream("dummy.nfo") << "8 bytes\n"; // создание файла
    std::FILE* fp = std::fopen("dummy.nfo", "rb");
    assert(fp);
    std::fseek(fp, 0, SEEK_END); // переход в конец
    const std::size_t filesize = std::ftell(fp);
    std::vector<std::uint8_t> buffer(filesize);
    std::fseek(fp, 0, SEEK_SET); // переход в начало
    std::fread(buffer.data(), sizeof(std::uint8_t), buffer.size(), fp);
    std::fclose(fp);
    std::printf("I've read %zi bytes\n", filesize);
}

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

I've read 8 bytes

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

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