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 移动位置的字符数 |
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 GiB 的文件。
[编辑] 示例
#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
|