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 以指示错误。
[编辑] 示例
#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 文档 for fseek
|