2011-04-25 132 views
10

我想使用std :: getline,但我的編譯器告訴我getline沒有被識別?std沒有會員'getline'?

#include <iostream> 
#include <cstdio> 
#include <cmath> 
#include <cstring> 
#include <fstream> 
#include <cstdlib> 

int main(){ 
    using namespace std; 
    string line; 
    ifstream ifile("test.in"); 
    if(ifile.is_open()){ 
     while(ifile.good()){ 
      getline(ifile,line); 
     } 
    } 
} 

回答

20

std::getlinestring頭中定義。

#include <string> 

此外,您的代碼不使用任何來自cstringcstdiocmath,或cstdlib;爲什麼還要包括這些?

編輯:爲了澄清關於cstringstring頭中的混亂,cstring拉內容的C運行時庫的string.hstd命名空間; string是庫的的C部分++標準並且包含getlinestd::basic_string<>(及其特std::stringstd::wstring)等 - 2個非常不同的報頭。

+0

這很容易。 ;] – karlphillip 2011-04-25 17:36:23

+0

我認爲cstring和字符串是相同的,但cstring是爲c + +? – pighead10 2011-04-25 17:36:37

+3

@Pig Head:'cstring'用於C-in-C++。它在'std'命名空間中定義了所有舊的C字符串函數('strlen'等)。 – cHao 2011-04-25 17:38:51

3

由於ildjarn指出,該功能在<string>聲明的,我驚訝你沒有在得到一個錯誤:

string line; 

而且,這樣的:

while(ifile.good()){ 
     getline(ifile,line); 
} 

不編寫讀取循環的方式。您必須測試讀操作的成功,而不是當前的流狀態。你想:

while(getline(ifile,line)) { 
} 
+0

這是舊的,我知道,但我認爲我只是在叮囑,並聲明上述讀取循環的方法打破了「分配條件」中的編程基本規則,如果使用嚴格的標準將會引發錯誤。 而((函數getline(IFILE,行)!== FALSE){ 。 。 。 } 會更好 – CrazyMerlin 2017-10-21 01:32:30