Reputation: 2243
Executing the command:
./program < input.txt
with the following code checking:
string input;
while(cin) {
getline(cin, input);
}
The above code seems to generate an extra getline()
call where input is empty. This happens regardless of whether or not there's a \n
on the last line of input.txt.
Upvotes: 3
Views: 6345
Reputation: 106530
@Jacob had the correct solution but deleted his answer for some reason. Here's what's going on in your loop:
cin
is checked for any of the failure bits (BADBIT, FAILBIT)cin
reports no problem because nothing has yet been read from the file.getline
is called which detects end of file, setting the EOF bit and FAILBIT.You need to do something like this instead:
std::string input;
while(std::getline(std::cin, input))
{
//Have your way with the input.
}
Upvotes: 7
Reputation: 13542
EDIT: please note, in the example below, I show you "how to detect EOF". As @Billy has pointed out, you probably want to use good()
instead of eof()
to detect any error condition or eof. I had included information about this at the end of my answer, but it's important, so I'm adding this note at the top to ensure that it's clear.
(original answer follows)
You want this:
string input;
while( !cin.eof() ) {
getline(cin, input);
}
using operator!
on an iostream
only checks whether a failure or other error condition has occurred. ios::operator!().
You can use good()
in place of !eof()
to check for any of the conditions eof
, badbit
, or failbit
. ios::good().
Upvotes: 2
Reputation: 163238
How about this:
string input;
while(getline(cin, input)) {
//do something with input...
}
Upvotes: 3