std::fseek

来自cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
在标头 <cstdio> 定义
int fseek( std::FILE* stream, long offset, int origin );

设置文件流 stream 的文件位置指示器。

stream 以二进制模式打开,则新位置是文件起始(若 originSEEK_SET)或当前文件位置(若 originSEEK_CUR),或文件结尾(若 originSEEK_END)算起的恰好 offset 个字节。不要求二进制流支持 SEEK_END,尤其是输出过空字节时。

stream 以文本模式打开,则仅有的受支持 offset 值为零(可用于任何 origin)和先前在关联到同一个文件的流上对 std::ftell 的调用的返回值(仅可用于 SEEK_SETorigin)。

stream 为宽取向,则一同应用对文本和二进制流的限制(允许 std::ftell 的结果与 SEEK_SET 一同使用,并允许零偏移量以 SEEK_SETSEEK_CUR 但非 SEEK_END 为基准)。

除了更改文件位置指示器,fseek 还撤销 std::ungetc 的效果并清除文件尾状态,若适用。

若发生读或写错误,则设置流的错误指示器(std::ferror)而不影响文件位置。

参数

stream - 要修改的文件流
offset - 相对 origin 迁移的字符数
origin - offset 所加上的位置。可具有下列值之一:SEEK_SETSEEK_CURSEEK_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"; // 创建文件
 
    std::FILE* fp = std::fopen("dummy.nfo", "rb");
    assert(fp);
 
    std::fseek(fp, 0, SEEK_END); // 寻位到结尾
    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

参阅

移动文件位置指示器到文件中的指定位置
(函数)
获取文件位置指示器
(函数)
返回当前文件位置指示器
(函数)
移动文件位置指示器到文件起始
(函数)