2011-04-25 67 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