public member function
<streambuf> <iostream>

std::streambuf::pubseekpos

streampos pubseekpos (streampos pos, ios_base::openmode which = ios_base::in | ios_base::out);
将内部位置指针设置为绝对位置
调用受保护的虚拟成员 seekpos,参数相同,均为 poswhich

seekpos 成员在 streambuf 中不执行任何操作,但派生类应覆盖此行为以相应地更改内部指针:filebufstringbuf 都覆盖此虚拟成员函数,以将 which 指定的内部指针设置为绝对位置 pos

参数

pos
位置指针的新绝对位置。
streampos 是一种定位类型,可以转换为/从整数类型转换(一个 fpos 类型)。
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
16
17
18
19
20
21
22
23
24
// changing position with pubseekpos
#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);  // get size
    if (size>20) {
      char buffer[11];
      // change position to the 10th character
      pbuf->pubseekpos(10);
      // read 10 characters
      pbuf->sgetn (buffer,10);
      // append null character to string
      buffer[10]=0;
      std::cout << buffer << '\n';
    }
    filestr.close();
  }
  return 0;
}

此示例读取并打印文件中的 10 个字符,从位置 10(第 11 个到第 20 个字符)开始。

数据竞争

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

异常安全

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

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

另见