public member function
<streambuf> <iostream>

std::streambuf::sungetc

int sungetc();
將當前位置指示器向後移動一位
嘗試將“受控輸入序列”的當前位置指示器向後移動一個位置,使得當前位置之前的字元再次可用於下一個輸入操作。

在內部,如果函式被呼叫時“讀指標”(gptr)指向“緩衝區起始”(eback),則函式會呼叫虛保護成員函式pbackfail。否則,函式將直接使用“讀指標”(gptr),而不呼叫任何虛成員函式。

其行為等同於如下實現:
1
2
3
4
5
int sungetc() {
  if ( (!gptr()) || (gptr()==eback()) ) return pbackfail();
  gbump(-1);
  return *gptr();
}

返回值

作為int型別的值,“受控輸入序列”的新當前字元。
失敗時,該函式返回檔案尾(end-of-file)值(EOF)。

示例

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

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->sungetc ();
      long n;
      std::cin >> n;
      std::cout << "You entered number " << n << '\n';
      break;
    }
  } while ( ch != EOF );

  return 0;
}

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

資料競爭

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

異常安全

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

另見