1

我试图弄清楚为什么现在它坏了,因为我让它工作了,但我不确定出了什么问题。我正在尝试从已打开的文件中获取简单的 getline,但是,编译器不断给我错误。我试过找其他人解决这些问题,但我找不到其他人有这个问题。有什么建议吗?

void Foo::bar(ifstream &inputFile)
{
// Read in the data, parse it out, and 
// call loadQueue
string input;
do {    
    getline(inputFile, input);
    loadQueue(input);
}while (!(inputFile.eof()));

}

这是我得到的回报:

g++    -c -o Airworthy.o Airworthy.cpp
Foo.cpp: In member function ‘void Airworthy::readData(std::ifstream&)’:
Foo.cpp:25:27: error: no matching function for call to ‘getline(std::ifstream&, std::string&)’
Foo.cpp:25:27: note: candidates are:
In file included from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/string:55:0,
             from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/locale_classes.h:42,
             from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/ios_base.h:43,
             from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ios:43,
             from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ostream:40,
             from /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/iostream:40,

关于问题是什么的任何想法?

4

2 回答 2

5

您很可能忘记了#include所有必要的标准标题。一种可能性是:

#include <fstream>

或者您可能忘记了:

#include <string> 

您总是必须#include明确地使用所有相关的标准标题,而不依赖于通过其他一些标题间接包含。

于 2013-04-28T15:05:42.913 回答
1

正如安迪所说,您需要适当的包含。但是,您的代码至少还有两个其他主要问题(其中一个会影响您需要的内容):

  • 你不应该(或几乎不)将ifstream参数作为参数传递给函数。除非该函数要执行 an open或 a close,否则您应该传递它std::istream&,以便可以使用 any 调用它istream,而不仅仅是ifstream.

    一旦你改变了这个,你需要包括<istream>,而不是<fstream>。(<fstream>包括<istream>。还有很多你不需要的。)

  • 你永远不应该循环播放! inputFile.eof(). 它不起作用。在你的情况下,循环应该是

    while ( std::getline( inputFile, input ) ) {4
        //  ...
    }
    

    它有效,几乎没有其他任何东西。

    一般来说,do...while循环在进行输入时几乎总是错误的;即使输入失败,它也会导致您处理输入(您会这样做 - 在测试是否成功之前但在测试之前的任何使用input都是 getline错误getline)。在输入失败之前,结果inputFile.eof()并没有得到很好的定义。用于 istream::eof()控制循环几乎总是错误的。

于 2013-04-28T16:02:03.447 回答