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

< cpp‎ | io‎ | basic filebuf

protected: virtual pos_type seekoff( off_type off, std::ios_base::seekdir dir, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out ); |  |

若可能，则重寻位文件指针到距文件起始、结尾或当前位置准确 `off` 个字符的位置（取决于 `dir` 的值）。

若关联文件未打开（ is_open()==false ），则立即失败。

若多字节字符编码依赖状态（ `codecvt::encoding()` 返回 -1 ）或为变长（ `codecvt::encoding()` 返回 ​0​ ），而偏移 `off` 非 ​0​ ，则立即失败：此函数无法确定对应 `off` 个字符的字节数。

若 `dir` 不是 std::basic_ios::cur 或偏移 `off` 非 ​0​ ，且此 filebuf 对象上最近做的操作是输出（即放置缓冲区非空，或最近调用的函数是 overflow() ），则调用 std::codecvt::unshift 确定需要的反迁移序列，并通过调用 overflow() 写入该序列到文件。

然后转换参数 `dir` 为 int 类型值 `whence` 如下：

`dir` 的值 | `whence` 的值
std::basic_ios::beg | SEEK_SET
std::basic_ios::end | SEEK_END
std::basic_ios::cur | SEEK_CUR

然后，若字符编码为定宽（ `codecvt::encoding()` 返回某个正值 `width` ），则如同用 std::fseek(file, width*off, whence) 移动文件指针。

否则，如同用 std::fseek(file, 0, whence) 移动文件指针。

基类函数签名所要求的 `openmode` 参数通常被忽略，因为 `std::basic_filebuf` 只维护一个文件位置。

### 参数

off | - | 要设置位置指示器到的相对位置。
dir | - | 定义要应用相对偏移到的基位置。它能为下列常量之一：
常量 | 解释
`beg` | 流的开始
`end` | 流的结尾
`cur` | 流位置指示器的当前位置
which | - | 定义要影响输入和/或输出序列的哪一个。它能为下列常量之一或其组合：
常量 | 解释
`in` | 影响输入序列
`out` | 影响输出序列

### 返回值

新构造的 pos_type 类型对象，存储结果文件位置，或在失败时为 pos_type(off_type(-1)) 。

### 注意

`seekoff()` 为 std::basic_streambuf::pubseekoff 所调用，它又为 std::basic_istream::seekg 、 std::basic_ostream::seekp 、 std::basic_istream::tellg 和 std::basic_ostream::tellp 所调用。

### 示例

    #include <iostream>
    #include <fstream>
    #include <locale>
    int main()
    {
        // 准备 10 字节文件，保有 4 个 UTF8 中的字符
        std::ofstream("text.txt") << u8"z\u00df\u6c34\U0001d10b"; // 或 u8"zß水𝄋"
                                               // 或 "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";

        // 用非转换编码打开
        std::ifstream f1("text.txt");
        std::cout << "f1's locale's encoding() returns "
                  << std::use_facet<std::codecvt<char, char, std::mbstate_t>>(f1.getloc()).encoding() << '\n'
                  << "pubseekoff(3, beg) returns " << f1.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
                  << "pubseekoff(0, end) returns " << f1.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';;

        // 用 UTF-8 打开
        std::wifstream f2("text.txt");
        f2.imbue(std::locale("en_US.UTF-8"));
        std::cout << "f2's locale's encoding() returns "
                  << std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(f2.getloc()).encoding() << '\n'
                  << "pubseekoff(3, beg) returns " << f2.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
                  << "pubseekoff(0, end) returns " << f2.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';

    }

输出：

    f1's locale's encoding() returns 1
    pubseekoff(3, beg) returns 3
    pubseekoff(0, end) returns 10
    f2's locale's encoding() returns 0
    pubseekoff(3, beg) returns -1
    pubseekoff(0, end) returns 10

### 参阅

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