public member function
<streambuf> <iostream>

std::streambuf::pubseekoff

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

seekoff 成员函数在 streambuf 中不执行任何操作,但派生类应重写此行为以适当修改内部指针:filebufstringbuf 都重写了这个虚拟成员函数,以将 which 指定的内部指针设置到 way 指定的方向偏移 off 的位置。

参数

off
偏移量,相对于 way 参数。
streamoff 是一个偏移量类型(通常是有符号整数类型)。
way
类型为 ios_base::seekdir 的对象。它可以接受以下任何常量值
偏移量相对于...
ios_base::beg流缓冲区的开始
ios_base::cur流缓冲区中的当前位置
ios_base::end流缓冲区的末尾
which
通常用于确定将修改哪个受控序列的位置:输入序列输出序列,或两者。它是一个 ios_base::openmode 类型的对象,对于此函数,它可以接受以下任意组合的有效常量值
受影响的位置指针
ios_base::in修改 *受控输入序列* 中的当前位置
ios_base::out修改 *受控输出序列* 中的当前位置

返回值

被修改的位置指针的新位置值。
streambuf 中的默认定义始终返回 -1
streampos 是一种定位类型,可以转换为/从整数类型转换(一个 fpos 类型)。

示例

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 的大小。

数据竞争

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

异常安全

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

另见