public member function
<istream> <iostream>

std::istream::get

單個字元 (1)
int get();istream& get (char& c);
c-string (2)
istream& get (char* s, streamsize n);istream& get (char* s, streamsize n, char delim);
stream buffer (3)
istream& get (streambuf& sb);istream& get (streambuf& sb, char delim);
獲取字元
從流中提取字元,作為未格式化的輸入

(1) 單個字元
從流中提取單個字元。
字元要麼被返回(第一個簽名),要麼被設定為其引數的值(第二個簽名)。
(2) C 字串
從流中提取字元並將它們儲存在 s 中作為 C 字串,直到提取了 (n-1) 個字元或遇到了 分隔符分隔符換行符 ('\n') 或 delim(如果指定了此引數)。
如果找到了分隔符,則不會從輸入序列中提取它,它將保留在原地,成為從流中提取的下一個字元(請參閱 getline 以獲取丟棄分隔符的替代方法)。
即使提取了空字串,如果 n 大於零,也會自動在寫入的序列末尾附加一個空字元 ('\0')。
(3) 流緩衝區
從流中提取字元並將它們插入由流緩衝區物件 sb 控制的輸出序列中,直到插入失敗或在輸入序列中遇到分隔符分隔符 是換行符 '\n'delim,如果指定了此引數)。
只有成功插入到 sb 的字元才從流中提取:無論是分隔符,還是最終未能插入到 sb 的字元,都不會從輸入序列中提取,它們將保留在原地,成為從流中提取的下一個字元。

當函式遇到檔案結尾時,也會停止提取字元。如果過早到達檔案結尾(在滿足上述條件之前),則函式會將 eofbit 標誌設定為true。

在內部,該函式首先透過構造一個 sentry 物件(將 noskipws 設定為 true)來訪問輸入序列。然後(如果 good),它會像呼叫其成員函式 sbumpcsgetc 一樣,從其關聯的流緩衝區物件中提取字元,最後銷燬 sentry 物件後再返回。

可以透過呼叫成員函式 gcount 來訪問此函式成功讀取並存儲的字元數。

引數

c
儲存提取值的字元引用。
s
指向字元陣列的指標,提取的字元將作為 c 字串儲存在其中。
如果函式未提取任何字元(或提取的第一個字元是分隔符)且 n 大於零,則 s 將被設定為一個空 C 字串。
n
要寫入 s 的最大字元數(包括終止的空字元)。
如果此值小於 2,則函式不提取任何字元並設定 failbit
streamsize 是一個帶符號整型。
delim
顯式分隔符:提取連續字元的操作會在下一個要提取的字元與此字元相等時停止。
sb
一個 streambuf 物件,其受控輸出序列用於複製字元。

返回值

第一個簽名返回讀取的字元,或者如果流中沒有可用字元,則返回檔案結尾值(EOF)(請注意,在這種情況下,failbit 標誌也會被設定為true)。

所有其他簽名始終返回 *this。請注意,可以檢查此返回值以確定流的狀態(有關詳細資訊,請參閱將流轉換為 bool)。

錯誤透過修改 *內部狀態標誌* 來發出訊號。
flagerror
eofbit函式停止提取字元,因為輸入序列沒有更多可用字元(已到達 檔案末尾)。
failbit未寫入任何字元,或者在 s 中儲存了空 C 字串。
badbit流錯誤(例如,當此函式捕獲由內部操作丟擲的異常時)。
設定為 true 時,流的完整性可能已受到影響。
一次操作可能設定多個標誌。

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

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// istream::get example
#include <iostream>     // std::cin, std::cout
#include <fstream>      // std::ifstream

int main () {
  char str[256];

  std::cout << "Enter the name of an existing text file: ";
  std::cin.get (str,256);    // get c-string

  std::ifstream is(str);     // open file

  char c;
  while (is.get(c))          // loop getting single characters
    std::cout << c;

  is.close();                // close file

  return 0;
}

此示例提示輸入現有文字檔案的名稱,並使用 cin.get 同時獲取單個字元和 C 字串,將其內容列印到螢幕上。

資料競爭

修改 csb 或指向 s 的陣列中的元素。
修改流物件。
對同一流物件的併發訪問可能導致資料競爭,標準流物件 cin與 stdio 同步時除外(在這種情況下,不會產生資料競爭,儘管不能保證提取的字元歸屬於哪個執行緒)。

異常安全

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

另見