std::basic_stringbuf<CharT,Traits,Allocator>:: seekoff
|
protected
:
virtual
pos_type seekoff
(
off_type off,
|
||
如果可能,将 std::basic_streambuf::gptr 和/或 std::basic_streambuf::pptr 重定位至缓冲区获取区和/或放置区的起始位置、末尾位置或当前位置偏移 off 个字符处。
- 如果 which 包含 std::ios_base::in 且此缓冲区已打开用于读取(即满足 ( which & std:: ios_base :: in ) == std:: ios_base :: in ),则按以下方式重定位获取区域内的读指针 std::basic_streambuf::gptr
- 如果 which 包含 std::ios_base::out 且此缓冲区已打开用于写入(即满足 ( which & std:: ios_base :: out ) == std:: ios_base :: out ),则按以下方式重定位放置区域内的写指针 std::basic_streambuf::pptr
- 如果 which 同时包含 std::ios_base::in 和 std::ios_base::out ,且缓冲区已同时打开用于读写(即满足 ( which & ( std:: ios_base :: in | std:: ios_base :: out ) ) == ( std:: ios_base :: in | std:: ios_base :: out ) ),并且 dir 为 std::ios_base::beg 或 std::ios_base::end ,则按以下方式同时重定位读写指针
- 否则,此函数执行失败
如果 gptr 和/或 pptr 被重新定位,其操作按以下方式执行:
off_type
的新指针偏移量
newoff
目录 |
参数
| off | - | 设置下一个指针的相对位置 | ||||||||
| dir | - |
定义应用相对偏移量的基准位置。可以是以下常量之一:
|
||||||||
| which | - |
定义影响输入序列、输出序列或两者。可以是以下常量之一或其组合:
|
返回值
pos_type
(
newoff
)
成功时返回,
pos_type
(
off_type
(
-
1
)
)
在失败或当
pos_type
无法表示结果流位置时返回。
示例
#include <iostream> #include <sstream> int main() { std::stringstream ss("123"); // 输入/输出 std::cout << "写入位置 = " << ss.tellp() << " 读取位置 = " << ss.tellg() << '\n'; // 绝对定位两个指针 ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // 将两个指针都向前移动1位 std::cout << "写入位置 = " << ss.tellp() << " 读取位置 = " << ss.tellg() << '\n'; // 尝试从当前位置将两个指针都向前移动1位 if (-1 == ss.rdbuf()->pubseekoff(1, std::ios_base::cur)) std::cout << "从当前位置移动两个指针失败\n"; std::cout << "写入位置 = " << ss.tellp() << " 读取位置 = " << ss.tellg() << '\n'; // 将写入指针向前移动1位,但不移动读取指针 // 也可以调用为 ss.seekp(1, std::ios_base::cur); ss.rdbuf()->pubseekoff(1, std::ios_base::cur, std::ios_base::out); std::cout << "写入位置 = " << ss.tellp() << " 读取位置 = " << ss.tellg() << '\n'; ss << 'a'; // 在写入位置写入 std::cout << "在写入位置写入 'a' 后,缓冲区内容为 " << ss.str() << '\n'; char ch; ss >> ch; std::cout << "在读取位置读取到字符 '" << ch << "'\n"; }
输出:
写入位置 = 0 读取位置 = 0 写入位置 = 1 读取位置 = 1 从当前位置移动两个指针失败 写入位置 = 1 读取位置 = 1 写入位置 = 2 读取位置 = 1 在写入位置写入 'a' 后,缓冲区内容为 12a 在读取位置读取到字符 '2'
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 适用版本 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 55 | C++98 |
seekoff
在失败时返回未定义的
无效流位置 |
失败时返回
pos_type ( off_type ( - 1 ) ) |
| LWG 375 | C++98 |
std::ios_base
的静态常量成员被
错误指定为 std::basic_ios 的成员 |
已修正 |
| LWG 432 | C++98 |
即使
newoff
+
off
可能指向
最后一个初始化字符之后的位置,
seekoff
仍可能成功
|
在此情况下
seekoff
会失败
|
| LWG 453 | C++98 |
重定位空的
gptr
(
)
和/或空的
pptr
(
)
且新偏移量为零时总是失败 |
在此情况下可以成功 |
| LWG 563 | C++98 |
由于在解决
LWG 问题 432
后
程序无法精确控制结束指针,导致无法使用该指针计算 newoff |
改用高水位标记指针
进行计算 |
参见
|
调用
seekoff
(
)
(
std::basic_streambuf<CharT,Traits>
的公开成员函数)
|
|
|
[virtual]
|
使用绝对寻址重定位输入序列、输出序列或两者的下一个指针
(虚受保护成员函数) |
|
[virtual]
|
使用相对寻址重定位文件位置
(
std::basic_filebuf<CharT,Traits>
的虚受保护成员函数)
|
|
[virtual]
|
使用相对寻址重定位输入序列、输出序列或两者的下一个指针
(
std::strstreambuf
的虚受保护成员函数)
|