public member function
<istream> <iostream>

std::basic_istream::putback

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

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

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

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

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

引數

c
要放回的字元。
如果這與回放位置的字元不匹配,則行為取決於與流關聯的特定流緩衝區物件
  • 字串緩衝區中,對於輸出流緩衝區,該值會被覆蓋,但函式在輸入緩衝區上失敗。
其他型別的流緩衝區可能會失敗、被忽略或覆蓋該位置的字元。
成員型別 char_type 是流使用的字元型別(即其第一個類模板引數 charT)。

返回值

*thisbasic_istream 物件。

錯誤透過修改內部狀態標誌來發出訊號
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設定為true。如果badbit在上次呼叫exceptions時被設定,則函式將重新丟擲捕獲到的異常。

另見