std:: fseek
|
定义于头文件
<cstdio>
|
||
|
int
fseek
(
std::
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
设置文件流 stream 的文件位置指示器。
如果流以二进制模式打开,当 origin 为 SEEK_SET 时,新位置是从文件开头精确计算的 offset 字节;当 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 系统上,可使用
_fseeki64
来处理大于 2 GiB 的文件。
示例
#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
|
|