Namespaces
Variants

std:: fseek

From cppreference.net
< cpp ‎ | io ‎ | c
定义于头文件 <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