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 個字元)開始。

資料競爭

修改*流緩衝區*物件。
同時訪問同一*流緩衝區*物件可能會導致資料競爭。

異常安全

基本保證:如果丟擲異常,則流緩衝區處於有效狀態(這也適用於標準派生類)。

無效引數會導致未定義行為

另見