public member function
<streambuf> <iostream>

std::basic_streambuf::pubseekoff

pos_type pubseekoff (off_type off, ios_base::seekdir way,                     ios_base::openmode which = ios_base::in | ios_base::out);
将内部位置指针设置到相对位置
调用受保护的虚成员函数 seekoff,参数与 offwaywhich 相同。

basic_streambuf 中,成员 seekoff 不执行任何操作,但派生类应重写此行为以适当修改内部指针:basic_filebufbasic_stringbuf 均重写了此虚成员函数,以将 which 指定的内部指针设置到相对于 way 指定方向的偏移 off 的位置。

参数

off
偏移量,相对于 way 参数。
成员类型 off_type 由 *字符特性* 确定:通常,它是已签名整型 streamoff 的别名。
way
类型为 ios_base::seekdir 的对象。它可以接受以下任何常量值
偏移量相对于...
ios_base::beg流缓冲区的开始
ios_base::cur流缓冲区中的当前位置
ios_base::end流缓冲区的末尾
which
通常用于确定要修改的 *受控序列* 的位置:*输入序列*、*输出序列* 或两者。它是一个 ios_base::openmode 类型的对象,对于此函数,它可以接受以下重要常量值的任何组合。
受影响的位置指针
ios_base::in修改 *受控输入序列* 中的当前位置
ios_base::out修改 *受控输出序列* 中的当前位置

返回值

已修改位置指针的新位置值。
basic_streambuf 中的默认定义始终返回 -1
成员类型 pos_type 由 *字符特征* 确定:通常,它是 fpos 类型(如 streampos),可以转换为/从整型值转换。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// get file size using pubseekoff
#include <iostream>     // std::cout, std::streambuf
#include <fstream>      // std::fstream

int main () {
  std::fstream filestr ("test.txt");
  if (filestr) {
    std::streambuf* pbuf = filestr.rdbuf();
    long size = pbuf->pubseekoff(0,filestr.end);
    std::cout << "The file size is " << size << " characters.\n";
    filestr.close();
  }

  return 0;
}

此程序使用 pubseekoff 将位置指针重新定位到文件缓冲区末尾时返回的值来打印文件 test.txt 的大小。

数据竞争

修改*流缓冲区*对象。
同时访问同一*流缓冲区*对象可能会导致数据竞争。

异常安全

基本保证:如果抛出异常,则流缓冲区处于有效状态(这也适用于标准派生类)。

无效参数会导致未定义行为

另见