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

< 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 ），则立即失败。

若文件为写入打开，则首先用 overflow() 写入放置区和任何当前感染的 locale 所要求的反迁移序列。

然后如同通过调用 std::fsetpos() 重寻位指针。

若文件为读取打开，则若需要则更新获取区。

若 `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 << "Before seekpos(" << sp << "), size of the get area is "
                       << egptr()-eback() << " with "
                       << egptr()-gptr() << " read positions available\n";
             pos_type rc = std::filebuf::seekpos(sp, which);
             std::cout << "seekpos() returns " << rc << ".\nAfter the call, "
                       << "size of the get area is "
                       << egptr()-eback() << " with "
                       << egptr()-gptr() << " read positions available\n";
    // 若 seekpos() 清空获取区则反注释
    //         std::filebuf::underflow();
    //         std::cout << "after forced underflow(), size of the get area is "
    //                   << egptr()-eback() << " with "
    //                   << egptr()-gptr() << " read positions available\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);
    }

可能的输出：

    Before seekpos(2), size of the get area is 110 with 109 read positions available
    seekpos() returns 2.
    After the call, size of the get area is 110 with 108 read positions available

### 参阅

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