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.
POSIX указывает, что fseek должна возвращать -1 в случае ошибки и устанавливать errno для указания ошибки.
В Windows для работы с файлами размером более 2 ГиБ можно использовать _fseeki64.
Пример
#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
См. также
| перемещает индикатор позиции в файле в указанное место (функция) |
|
| получает индикатор позиции в файле (функция) |
|
| возвращает текущий индикатор позиции в файле (функция) |
|
| перемещает индикатор позиции в файле в начало файла (функция) |
|
Документация C для fseek |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/fseek