CppDS.com

C++ 98 11 14 17 20 手册

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

来自cppreference.com
< 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 ),而偏移 off0 ,则立即失败:此函数无法确定对应 off 个字符的字节数。

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

然后转换参数 dirint 类型值 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::seekgstd::basic_ostream::seekpstd::basic_istream::tellgstd::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

参阅

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