std::basic_filebuf<CharT,Traits>::seekpos

来自cppreference.com
< cpp‎ | io‎ | basic filebuf
 
 
 
 
protected:

virtual pos_type seekpos( pos_type sp,

                          std::ios_base::openmode which = std::ios_base::in | std::ios_base::out );

在可能时重寻位文件指针到 sp 指示的位置。关联文件未打开(is_open() == false)时立即失败。

重寻位按以下流程进行:

1) 如果文件因写入打开,那么用 overflow() 写入放置区和任何当前浸染的本地环境要求的反迁移序列。
2) 如同通过调用 std::fsetpos() 重寻位指针。
3) 如果文件因读取打开,那么在需要时更新获取区。

如果 sp 不是通过在同一文件上调用 seekoff()seekpos() 获得的,那么行为未定义。

参数

sp - 之前在同一文件上调用 seekoff()seekpos() 获得的文件位置
which - 定义会影响到的输入和/或输出序列。它可以是下列常量之一或它们的组合:
常量 解释
in 影响输入序列
out 影响输出序列

返回值

成功时返回 sp,失败时返回 pos_type(off_type(-1))

注意

seekpos() 会被 std::basic_streambuf::pubseekpos() 调用,后者会被 std::basic_istream::seekg()std::basic_ostream::seekp() 的单参数版本调用。

许多实现不在 seekpos() 中更新读取区域,而是委托给下次 sgetc() 所调用的 underflow()

示例

在一些实现中,seekpos() 清空读取区域并需要第二个 underflow() 以观测效果。

#include <fstream>
#include <iostream>
 
struct mybuf : std::filebuf
{
    pos_type seekpos(pos_type sp, std::ios_base::openmode which)
    {
        std::cout << "在 seekpos(" << sp << ") 前,读取区域的大小是 "
                  << egptr() - eback() << ",其中有 "
                  << egptr() - gptr() << " 个可用读取位置。\n";
 
        pos_type rc = std::filebuf::seekpos(sp, which);
 
        std::cout << "seekpos() 返回 " << rc << "。\n在调用后,"
                  << "读取区域的大小是 "
                  << egptr() - eback() << ",其中有 "
                  << egptr() - gptr() << " 个可用读取位置。\n";
// 如果 seekpos() 清空获取区就取消注释
//        std::filebuf::underflow();
//        std::cout << "在强制 underflow() 后,读取区域的大小是 "
                    << egptr() - eback() << ",其中有 "
                    << egptr() - gptr() << " 个可用读取位置。\n";
 
        return rc;
    }
};
 
int main()
{
    mybuf buf;
    buf.open("test.txt", std::ios_base::in);
    std::istream stream(&buf);
    stream.get(); // 读一个字符以强制 underflow()
    stream.seekg(2);
}

可能的输出:

在 seekpos(2) 前,读取区域的大小是 110,其中有 109 个可用读取位置。
seekpos() 返回 2。
在调用后,读取区域的大小是 110,其中有 108 个可用读取位置。

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 55 C++98 seekpos 在失败时返回了未定义的无效流位置 失败时返回 pos_type(off_type(-1))
LWG 171 C++98 重寻位的流程不明确 使之明确

参阅

调用 seekpos()
(std::basic_streambuf<CharT,Traits> 的公开成员函数)
用相对寻址重寻位文件位置
(虚受保护成员函数)
移动文件位置指示器到文件中的指定位置
(函数)