public member function
<istream> <iostream>

std::istream::putback

istream& putback (char c);
將字元放回
嘗試將流的當前位置減少一個字元,使從流中提取的最後一個字元再次可供提取操作使用。

內部,該函式首先構造一個 sentry 物件(並將 noskipws 設定為 true)來訪問輸入序列。然後(如果 good),它呼叫其關聯的 流緩衝區 物件(如果存在)上的 sputbackc(c)。最後,在返回前銷燬 sentry 物件。

如果在呼叫之前設定了 eofbit 標誌,則函式失敗(設定 failbit 並返回)。
該函式會清除在呼叫之前設定的 eofbit 標誌。

如果對 sputbackc 的呼叫失敗,則函式將設定 badbit 標誌。請注意,即使 c 確實是從流中提取的最後一個字元,這也會發生(具體取決於關聯的 流緩衝區 物件的內部實現)。

呼叫此函式會將gcount的返回值設定為零。

引數

c
要放回的字元。
如果這與 put back 位置的字元不匹配,則行為取決於與流關聯的特定 流緩衝區 物件。
  • 字串緩衝區 中,輸出流緩衝區的該值被覆蓋,但函式在輸入緩衝區上失敗。
  • 檔案緩衝區 中,該值被覆蓋在中間緩衝區上(如果支援):再次讀取該字元將產生 c,但關聯的輸入序列未被修改。
其他型別的 流緩衝區 可能會失敗、被忽略或覆蓋該位置的字元。

返回值

istream 物件 (*this)。

錯誤透過修改 *內部狀態標誌* 來發出訊號。
flagerror
eofbit-
failbit構造sentry失敗(例如,當流狀態在呼叫之前不是good時)。
badbit內部對 sputbackc 的呼叫失敗,或者流上發生了其他錯誤(例如,當函式捕獲內部操作丟擲的異常時,或者當沒有 流緩衝區 與流關聯時)。
當設定時,流的完整性可能受到影響。
單個操作可能會設定多個標誌。

如果操作設定了透過成員 exceptions 註冊的 內部狀態標誌,則函式將丟擲成員型別為 failure 的異常。

示例

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

int main () {
  std::cout << "Please, enter a number or a word: ";
  char c = std::cin.get();

  if ( (c >= '0') && (c <= '9') )
  {
    int n;
    std::cin.putback (c);
    std::cin >> n;
    std::cout << "You entered a number: " << n << '\n';
  }
  else
  {
    std::string str;
    std::cin.putback (c);
    getline (std::cin,str);
    std::cout << "You entered a word: " << str << '\n';
  }
  return 0;
}

可能的輸出
Please, enter a number or a word: pocket
You entered a word: pocket


資料競爭

修改流物件。
併發訪問同一個流物件可能導致資料爭用。

異常安全

基本保證:如果丟擲異常,物件處於有效狀態。
如果結果 錯誤狀態標誌 不是 goodbit 且成員 exceptions 被設定為針對該狀態丟擲,則函式將丟擲成員型別為 failure 的異常。
由內部操作丟擲的任何異常都會被該函式捕獲和處理,並設定 badbit。如果 badbit 在上次呼叫 exceptions 時被設定,則函式將重新丟擲捕獲到的異常。

另見