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.
Asked
Active
Viewed 1.2e+01k times
52
-
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. – Konrad Rudolph Feb 12 '10 at 12:03
3 Answers
71
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)
}

AProgrammer
- 51,233
- 8
- 91
- 143
-
1This 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: http://gehrcke.de/2011/06/reading-files-in-c-using-ifstream-dealing-correctly-with-badbit-failbit-eofbit-and-perror/ – Dr. Jan-Philip Gehrcke Jul 06 '11 at 11:19
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))

Manuel
- 12,749
- 1
- 27
- 35
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();

Milind Prajapat
- 156
- 7