assassin
assassin

Reputation: 21169

checking for eof in string::getline

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.

Upvotes: 56

Views: 128458

Answers (3)

Milind Prajapat
Milind Prajapat

Reputation: 195

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();

Upvotes: 3

AProgrammer
AProgrammer

Reputation: 52284

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)
}

Upvotes: 75

Manuel
Manuel

Reputation: 13109

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))

Upvotes: 17

Related Questions