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 , особенно если выводятся дополнительные нулевые байты.
Если поток открыт в текстовом режиме, единственными поддерживаемыми значениями для 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
Смотрите также
|
перемещает индикатор позиции файла в определённое место в файле
(функция) |
|
|
получает индикатор позиции файла
(функция) |
|
|
возвращает текущий индикатор позиции файла
(функция) |
|
|
перемещает индикатор позиции файла в начало файла
(функция) |
|
|
Документация C
для
fseek
|
|