std::fseek
定义于头文件 <cstdio>
|
||
int fseek( std::FILE* stream, long offset, int origin ); |
||
设置文件流 stream
的文件位置指示器为 offset
所指向的值。
若 stream
以二进制模式打开,则新位置准确地是文件起始后(若 origin
为 SEEK_SET )或当前文件位置后(若 origin
为 SEEK_CUR ),或文件结尾后(若 origin
为 SEEK_END )的 offset
字节。不要求二进制流支持 SEEK_END ,尤其是是否输出附加的空字节。
若 stream
以文本模式打开,则仅有的受支持 offset
值为零(可用于任何 origin
)和先前在关联到同一个文件的流上对 std::ftell 的调用的返回值(仅可用于 SEEK_SET 的 origin
)。
若 stream
为宽面向,则一同应用对文本和二进制流的限制(允许 std::ftell 的结果与 SEEK_SET 一同使用,并允许零 offset 以 SEEK_SET 和 SEEK_CUR 但非 SEEK_END 为基准)。
除了更改文件位置指示器, fseek
还撤销 std::ungetc 的效果并清除文件尾状态,若可应用。
若发生读或写错误,则设置流的错误指示器( std::ferror )而不影响文件位置。
参数
stream | - | 要修改的文件流 |
offset | - | 相对 origin 迁移的字符数 |
origin | - | offset 所加上的位置。它能拥有下列值之一: SEEK_SET 、 SEEK_CUR 、 SEEK_END
|
返回值
成功时为 0 ,否则为非零。
注意
在巡位到宽流的非结尾位置后,下个对任意输出函数的调用可能令剩下的文件内容未定义,例如通过输出一个长度不同的多字节序列。
对于文本流, offset
仅有的合法值是 0 (可应用于任意 origin
)和先前 ftell 调用的返回值(仅可应用于 SEEK_SET
)。
POSIX 允许在文件尾之后巡位。若在此巡位后进行输出,则任何间隙中的读取将返回零字节。在文件系统支持的场合,这会创建一个稀疏文件。
POSIX 亦要求 fseek 先进行 fflush ,若有任何未写入数据(但是否恢复迁移状态是实现定义的)。标准 C++ 文件流保证冲入并反迁移: std::basic_filebuf::seekoff 。
示例
#include <cstdio> #include <cstdint> #include <vector> #include <fstream> #include <cassert> int main() { std::ofstream("dummy.nfo") << "sample data\n"; std::FILE* fp = std::fopen("dummy.nfo", "rb"); assert(fp); std::fseek(fp, 0, SEEK_END); // 寻位到结尾 std::size_t filesize = std::ftell(fp); std::fseek(fp, 0, SEEK_SET); // 寻位到起始 std::vector<uint8_t> buffer(filesize); std::fread(buffer.data(), sizeof(uint8_t), buffer.size(), fp); std::fclose(fp); std::printf("i've read %zi bytes\n", filesize); }
输出:
i've read 12 bytes
参阅
移动文件位置指示器到文件中的指定位置 (函数) | |
获取文件位置指示器 (函数) | |
返回当前文件位置指示器 (函数) | |
移动文件位置指示器到文件起始 (函数) |