public member function
<streambuf> <iostream>

std::basic_streambuf::sputbackc

int_type sputbackc (char_type c);
將字元放回
嘗試將受控輸入序列的當前位置指示器移回當前位置之前的一個字元。

成員函式 sungetc 的行為類似,但不需要任何引數。

內部,如果讀取指標gptr)沒有任何後推位置可用,或者 c 不等於當前讀取位置之前的字元,則函式會呼叫虛保護成員 pbackfail。否則,函式直接使用讀取指標gptr),而不呼叫虛成員函式。

其行為等同於如下實現:
1
2
3
4
5
6
int_type sputbackc(char_type c) {
  if ( (!gptr()) || (gptr()==eback()) || (!traits_type::eq(c,gptr()[-1])) )
    return pbackfail (traits_type::to_int_type(c));
  gbump(-1);
  return traits_type::to_int_type(*gptr());
}

引數

c
要放回的字元。
如果此字元與後推位置的字元不匹配,其行為取決於 pbackfail:它可能失敗、被忽略或覆蓋該位置的字元。
成員型別 char_type流緩衝區(第一個類模板引數)中字元的型別。

返回值

透過成員 traits_type::to_int_type 轉換為 int_type 型別的值,即放回字元的值。
如果失敗,該函式返回*檔案結束符*值(traits_type::eof())。
成員型別int_type是能夠表示任何字元值或特殊*檔案結束*符的整型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// sputbackc example
#include <iostream>     // std::cin, std::cout, std::streambuf, std::streamsize

int main () {
  char ch;
  std::streambuf * pbuf = std::cin.rdbuf();

  std::cout << "Please, enter some letters and then a number: ";
  do {
    ch = pbuf->sbumpc();

    if ( (ch>='0') && (ch <='9') )
    {
      pbuf->sputbackc (ch);
      long n;
      std::cin >> n;
      std::cout << "You entered number " << n << '\n';
      break;
    }
  } while ( ch != std::streambuf::traits_type::eof() );

  return 0;
}

此示例逐個從標準輸入獲取字元。當找到第一個數字時,呼叫 sputback 將流的位置恢復到該數字,以便使用提取運算子 >> 將其提取為數字的一部分。

資料競爭

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

異常安全

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

另見