std::basic_filebuf<CharT,Traits>::seekoff
protected: virtual pos_type seekoff( off_type off, |
||
如果可能,将文件指针重新定位到与文件开头、结尾或当前位置(取决于 dir 的值)正好 off 个字符对应的位置。
如果关联文件未打开 (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 转换为 whence 类型的值 int,如下所示
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 | - | 定义要应用相对偏移量的基准位置。可以是以下常量之一
| ||||||||
which | - | 定义要影响的输入和/或输出序列。可以是以下常量之一或其组合
|
[编辑] 返回值
一个新构造的 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 <fstream> #include <iostream> #include <locale> template<typename CharT> int get_encoding(const std::basic_istream<CharT>& stream) { using Facet = std::codecvt<CharT, char, std::mbstate_t>; return std::use_facet<Facet>(stream.getloc()).encoding(); } int main() { // prepare a 10-byte file holding 4 characters ("zß水𝄋") in UTF-8 std::ofstream("text.txt") << "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"; // open using a non-converting encoding std::ifstream f1("text.txt"); std::cout << "f1's locale's encoding() returns " << get_encoding(f1) << '\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'; // open using UTF-8 std::wifstream f2("text.txt"); f2.imbue(std::locale("en_US.UTF-8")); std::cout << "f2's locale's encoding() returns " << get_encoding(f2) << '\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
[编辑] 缺陷报告
以下行为更改缺陷报告被追溯地应用于先前发布的 C++ 标准。
DR | 应用于 | 发布的行为 | 正确行为 |
---|---|---|---|
LWG 55 | C++98 | seekoff 返回未定义的无效的流位置 |
pos_type(off_type(-1)) 在失败时返回 |
[编辑] 参见
调用 seekoff() ( std::basic_streambuf<CharT,Traits> 的公有成员函数) | |
[virtual] |
使用绝对寻址重新定位文件位置 (虚拟保护成员函数) |
将文件位置指示器移动到文件中的特定位置 (函数) |