public member function
<istream> <iostream>

std::basic_istream::sync

int sync();
同步輸入緩衝區
同步與流關聯的 *流緩衝區* 與其控制的輸入序列。

操作的具體細節取決於與流關聯的*流緩衝區*物件的特定實現。

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

如果 pubsync 的呼叫失敗(即,它返回 -1),則函式將設定 badbit 標誌,並返回 -1。否則返回零,表示成功。

請注意,被呼叫的函式在不執行任何操作的情況下也可能成功,如果這是為流緩衝區物件同步定義的行為。

呼叫此函式不會改變 gcount 返回的值。

引數



返回值

如果函式失敗,無論是由於沒有與流關聯*流緩衝區*物件(rdbuf 為 null),還是由於對其 pubsync 成員的呼叫失敗,它都返回 -1
否則,它返回零,表示成功。

錯誤透過修改*內部狀態標誌*來指示
flagerror
eofbit-
failbit構造 sentry 失敗(例如,當呼叫前的 *流狀態* 不是 good 時)。
badbit呼叫 pubsync 失敗,或流上發生其他錯誤(例如,函式捕獲了內部操作丟擲的異常)。
設定後,流的完整性可能受到影響。
一次操作可能設定多個標誌。

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

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// syncing input stream
#include <iostream>     // std::cin, std::cout

int main () {
  char first, second;

  std::cout << "Please, enter a word: ";
  first = std::cin.get();
  std::cin.sync();

  std::cout << "Please, enter another word: ";
  second = std::cin.get();

  std::cout << "The first word began by " << first << '\n';
  std::cout << "The second word began by " << second << '\n';

  return 0;
}

此示例演示了 synccin 的某些實現中的行為,它會從標準輸入字元佇列中刪除任何未讀取的字元。

可能的輸出
Please, enter a word: test
Please enter another word: text
The first word began by t
The second word began by t


資料競爭

修改流物件。
併發訪問同一流物件可能導致資料競爭,除了標準流物件 cinwcin 在*與 stdio 同步*時(在這種情況下,不會啟動資料競爭,儘管不保證字元從執行緒中提取或同步的順序)。

異常安全

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

另見