public member function
<istream> <iostream>

std::basic_istream::unget

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

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

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

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

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

引數



返回值

*thisbasic_istream 物件。

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

如果操作設定了一個與成員 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::unget 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.unget();
    std::cin >> n;
    std::cout << "You entered a number: " << n << '\n';
  }
  else
  {
    std::string str;
    std::cin.unget();
    getline (std::cin,str);
    std::cout << "You entered a word: " << str << '\n';
  }
  return 0;
}

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


資料競爭

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

異常安全

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

另見