Spec-Zone.ru › C++

std::fseek

Определено в заголовке <cstdio>
int fseek( std::FILE* stream, long offset, int origin );

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

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

Если поток stream открыт в текстовом режиме, единственные поддерживаемые значения для 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.

Пример

#include <cassert>
#include <cstdio>
#include <cstdint>
#include <fstream>
#include <vector>
 
int main()
{
    std::ofstream("dummy.nfo") << "8 bytes\n"; // create the file
 
    std::FILE* fp = std::fopen("dummy.nfo", "rb");
    assert(fp);
 
    std::fseek(fp, 0, SEEK_END); // seek to end
    const std::size_t filesize = std::ftell(fp);
    std::vector<std::uint8_t> buffer(filesize);
 
    std::fseek(fp, 0, SEEK_SET); // seek to start
    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

См. также

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

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

Spec-Zone.ru

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