public member function
<istream> <iostream>

std::istream::getline

istream& getline (char* s, streamsize n );istream& getline (char* s, streamsize n, char delim );
獲取行
從流中提取字元作為未格式化輸入,並將它們儲存在 s 中作為 C 字串,直到提取的字元是分隔符,或者 n 個字元已寫入 s (包括終止的空字元)。

對於第一種形式,分隔符換行符 ('\n'),對於第二種形式,它是 delim:當在輸入序列中找到它時,它會從輸入序列中提取,但會被丟棄並且不會寫入 s

如果到達檔案尾,該函式也會停止提取字元。如果過早到達檔案尾 (在寫入 n 個字元或找到 delim 之前),則該函式會將 eofbit 標誌設定為 true。

如果函式未提取任何字元,或者一旦寫入了 n-1 個字元後未找到分隔符,則 failbit 標誌會被設定。請注意,如果輸入序列中緊跟這 n-1 個字元的字元正好是分隔符,它也會被提取,並且 failbit 標誌不會被設定 (提取的序列正好是 n 個字元長)。

即使提取了一個空字串,如果 n 大於零,一個空字元 ('\0') 也會自動附加到寫入的序列中。

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

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

此函式已針對 string 物件在標頭檔案 <string> 中進行了過載:請參閱 getline(string)

引數

s
指向字元陣列的指標,提取的字元將作為 c 字串儲存在其中。
n
要寫入 s 的字元的最大數量 (包括終止的空字元)。
如果函式因達到此限制而停止讀取,而未找到分隔符,則會設定 failbit 內部標誌。
streamsize 是一個帶符號整型。
delim
顯式分隔符:提取連續字元的操作會一直進行,直到下一個要提取的字元與此字元相等為止。

返回值

istream 物件 (*this)。

錯誤透過修改 *內部狀態標誌* 來發出訊號。
flagerror
eofbit函式停止提取字元,因為輸入序列沒有更多可用字元(已到達 檔案末尾)。
failbit要麼未找到分隔符,要麼根本沒有提取任何字元 (因為檔案尾位於第一個字元之前,或者因為 sentry 的構造失敗)。
badbit流錯誤(例如,當此函式捕獲由內部操作丟擲的異常時)。
當設定為 true 時,流的完整性可能已受到影響。
一次操作可以設定多個標誌。

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

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// istream::getline example
#include <iostream>     // std::cin, std::cout

int main () {
  char name[256], title[256];

  std::cout << "Please, enter your name: ";
  std::cin.getline (name,256);

  std::cout << "Please, enter your favourite movie: ";
  std::cin.getline (title,256);

  std::cout << name << "'s favourite movie is " << title;

  return 0;
}

此示例說明了如何從標準輸入流 (cin) 獲取行。

資料競爭

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

異常安全

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

另見