打开文件流输入的Getline问题

Getline issue with input of open file stream

本文关键字:Getline 问题 输入 文件      更新时间:2023-10-16

我想弄清楚为什么这是打破了现在,因为我有它的工作,我不知道什么是错的。我正在尝试一个简单的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,

你知道是什么问题吗?

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

#include <fstream>

或者你可能忘了:

#include <string> 

您必须明确地#include所有相关的标准标头,而不依赖于通过其他标头间接包含

正如Andy所说,您需要适当的include。有,但是,您的代码至少存在另外两个主要问题(1其中哪一个会影响你需要哪一个):

  • 你应该永远(或几乎永远)通过ifstream作为一个函数的参数。除非函数要做anopenclose,你应该通过std::istream&,这样它可以被任何istream调用,而不仅仅是ifstream

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

  • 永远不要在! inputFile.eof()上循环。它不工作。在您的例子中,循环应该是

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

    它可以工作,几乎没有其他东西可以。

    一般来说,do...while循环几乎总是错误的做输入;它会导致你处理输入,即使之后使用input会失败getline,但在测试getline是否成功之前是一个错误)。而inputFile.eof()的结果并非如此非常好的定义,直到输入失败。使用istream::eof()控制循环几乎总是错误的