问题
I'm trying to figure out why this is broke now, because I had it working and I'm not sure what is wrong. I'm trying a simple getline from a file that's been opened, however, the compiler keeps giving me errors. I've tried finding someone else with these issues, but I haven't been able to find anyone else with this. Any advice?
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()));
}
Here is what I get in return:
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,
Any ideas on what the issue is?
回答1:
Most likely you forgot to #include all the necessary standard headers. One possibility is:
#include <fstream>
Or perhaps you forgot to:
#include <string>
You always have to #include all pertinent standard headers explicitly, without relying on indirect inclusion through some other headers.
回答2:
As Andy says, you need the appropriate includes. There are, however, at least two other major problems with your code (one of which will affect which includes you need):
You should never (or almost never) pass
ifstreamas an argument to a function. Unless the function is going to do anopenor aclose, you should pass itstd::istream&, so that it can be called with anyistream, and not justifstream.Once you've changed this, you need to include
<istream>, and not<fstream>. (<fstream>includes<istream>. And a lot more which you don't need.)You should never loop on
! inputFile.eof(). It doesn't work. In your case, the loop should bewhile ( std::getline( inputFile, input ) ) {4 // ... }It works, and almost nothing else does.
In general, a
do...whileloop is almost always wrong when doing input; it results in your processing the input even when it fails (which you do—any use ofinputafter thegetlinebut before testing whether thegetlinehas succeeded is an error). And the results ofinputFile.eof()are not really well defined until input has failed. Usingistream::eof()to control a loop is almost always an error.
来源:https://stackoverflow.com/questions/16264205/getline-issue-with-input-of-open-file-stream