58

How do I check for end-of-file using the std::getline function? If I use eof() it won't signal eof until I attempt to read beyond end-of-file.

1
  • That eof isn’t recommended is true, but for a different reason. Reading past EOF is exactly what you do when you want to test for EOF, so eof works well in that regard. Commented Feb 12, 2010 at 12:03

3 Answers 3

77

The canonical reading loop in C++ is:

while (getline(cin, str)) {

}

if (cin.bad()) {
    // IO error
} else if (!cin.eof()) {
    // format error (not possible with getline but possible with operator>>)
} else {
    // format error (not possible with getline but possible with operator>>)
    // or end of file (can't make the difference)
}
Sign up to request clarification or add additional context in comments.

1 Comment

This answer is just great. If you need error messages, this is the (only) way to go. It really takes its time to figure this out: gehrcke.de/2011/06/…
17

Just read and then check that the read operation succeeded:

 std::getline(std::cin, str);
 if(!std::cin)
 {
     std::cout << "failure\n";
 }

Since the failure may be due to a number of causes, you can use the eof member function to see it what happened was actually EOF:

 std::getline(std::cin, str);
 if(!std::cin)
 {
     if(std::cin.eof())
         std::cout << "EOF\n";
     else
         std::cout << "other failure\n";
 }

getline returns the stream so you can write more compactly:

 if(!std::getline(std::cin, str))

Comments

3

ifstream has peek() function, which reads the next character from the input stream without extracting it, simply returns the next character in the input string. Thus, when the pointer is at the last character, it will return EOF.

string str;
fstream file;

file.open("Input.txt", ios::in);

while (file.peek() != EOF) {
    getline(file, str);
    // code here
}

file.close();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.