std::strstreambuf::seekpos
< cpp | io | strstreambuf
protected: virtual pos_type seekpos(pos_type sp, |
||
若可能,则重寻位 std::basic_streambuf::gptr 和/或 std::basic_streambuf::pptr 到 sp
所指示的位置。
若 which
中设置了 std::ios_base::in ,则试图重寻位 gptr()
(获取区中的下一位置指针)。若 which
中设置了 std::ios_base::out ,则试图重寻位 pptr()
(放置区中的下一位置指针)。若 which
中未设置这些位,则操作失败。
以下列方式重寻位每个下一位置指针:
1) 若下一位置指针为空,则操作失败
2) 否则,通过调用 sp.offset() 确定新偏移(
off_type
类型的) newoff
。若 newoff
为负、在缓冲区边界外或非法,则操作失败。3) 否则,如同用 gptr() = eback()+newoff 或 pptr() = pbase()+newoff 赋值下一位置指针。
参数
sp | - | 流位置,由 seekoff() 或 seekpos() 所获得者
| ||||||||
which | - | 定义要影响输入序列、输出序列或两者。它能为下列常量之一或其组合:
|
返回值
成功时为转换到 pos_type
的结果偏移,失败时为 pos_type(off_type(-1)) 。
注意
seekpos()
为 std::basic_streambuf::pubseekpos() 所调用,后者为 std::basic_istream::seekg() 和 std::basic_ostream::seekp() 的单参数版本所调用。
示例
运行此代码
#include <strstream> #include <cstring> #include <iostream> struct mybuf : std::strstreambuf { mybuf(const char* str) : std::strstreambuf(str, std::strlen(str)) {} 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::strstreambuf::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"; return rc; } }; int main() { mybuf buf("12345"); std::iostream stream(&buf); stream.seekg(2); }
输出:
Before seekpos(2), size of the get area is 5 with 5 read positions available seekpos() returns 2. After the call, size of the get area is 5 with 3 read positions available
参阅
调用 seekpos() ( std::basic_streambuf<CharT,Traits> 的公开成员函数) | |
[虚] |
用绝对寻址,重定位输入序列、输出序列或两者中的下一位置指针 ( std::basic_stringbuf<CharT,Traits,Allocator> 的虚受保护成员函数) |
[虚] |
用绝对寻址重寻位文件位置 ( std::basic_filebuf<CharT,Traits> 的虚受保护成员函数) |
[虚] |
用相对寻址重寻位输入序列、输出序列或两者中的下一位置指针 (虚受保护成员函数) |