【问题标题】:std has no member 'getline'?标准没有成员'getline'?
【发布时间】:2011-08-12 11:23:01
【问题描述】:

我正在尝试使用 std::getline,但我的编译器告诉我 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);
        }
    }
}

【问题讨论】:

    标签: c++ io std getline


    【解决方案1】:

    std::getlinestring 标头中定义。

    #include <string>
    

    另外,您的代码没有使用来自cstringcstdiocmathcstdlib 的任何内容;为什么要包括这些?

    编辑:为了澄清关于 cstringstring 标头的混淆,cstringC 运行时库的 string.h 的内容拉入std 命名空间; stringC++ 标准库 的一部分,包含getlinestd::basic_string&lt;&gt;(及其特化std::stringstd::wstring)等——两个非常 em> 不同的标题。

    【讨论】:

    • 我以为cstring和string是一样的,但是cstring是c++的?
    • @Pig Head: cstring 用于 C-in-C++。它在std 命名空间中定义了所有旧的 C 字符串函数(strlen 等)。
    • 哦,好的。我认为这是因为许多其他标题使用 `cx
    • 那些cwhatever 标准头文件几乎总是一样的:将旧的C 头文件导入std 命名空间。它与 C++ 没有太大关系,只是因为它增加了 C 兼容性并减少了命名空间污染。
    • @Pig Head - 讨论了三种不同的标头:&lt;string&gt;&lt;string.h&gt;&lt;cstring&gt;&lt;cstring&gt;&lt;string.h&gt; 或多或少相同。 &lt;string&gt;&lt;string.h&gt; 大不相同,所以 &lt;cstring&gt;&lt;string&gt; 也大不相同。
    【解决方案2】:

    正如 ildjarn 指出的那样,该函数在 &lt;string&gt; 中声明,我很惊讶您在以下位置没有收到错误:

    string line;
    

    还有,这个:

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

    不是编写读取循环的方法。您必须测试读取操作是否成功,而不是当前流状态。你想要:

    while( getline(ifile,line) ) {
    }
    

    【讨论】:

    • 这是旧的,我知道,但我想我只是插话并声明上面的读取循环方法违反了“条件赋值”的编程基本规则,这将引发错误如果使用严格的标准。 while ((getline(ifile, line) !== false) { . . . } 会更好
    • 我做了#include 并且可以声明字符串,但无法识别getline。我更改为 #Include 以使 getline 也可以正常工作。
    【解决方案3】:

    这是因为getline来自字符串库,你需要#include &lt;string&gt;#include &lt;cstring&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 2017-02-18
      • 2017-07-18
      • 1970-01-01
      • 2021-06-05
      • 2016-07-08
      • 1970-01-01
      • 2017-06-20
      相关资源
      最近更新 更多