命名空间
变体
操作

std::fseek

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

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

如果 stream 以二进制模式打开,则新位置从文件开头算起正好是 offset 个字节(如果 originSEEK_SET),从当前文件位置算起(如果 originSEEK_CUR),从文件末尾算起(如果 originSEEK_END)。二进制流不需要支持 SEEK_END,特别是当输出额外的空字节时。

如果 stream 以文本模式打开,则 offset 的唯一支持值是零(适用于任何 origin)和之前对与同一文件关联的流调用 std::ftell 返回的值(仅适用于 originSEEK_SET)。

如果 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"; // 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