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.
std::getline will read up to and including the final newline character and then return. It won't attempt to read beyond the end of the file. The EOF bit won't be set.
Returned value If successful, getline() returns the number of characters that are read, including the newline character, but not including the terminating null byte ( '\0' ). This value can be used to handle embedded null bytes in the line read.
Using std::getline() in C++ to split the input using delimiters. We can also use the delim argument to make the getline function split the input in terms of a delimiter character. By default, the delimiter is \n (newline). We can change this to make getline() split the input based on other characters too!
C++ provides a special function, eof( ), that returns nonzero (meaning TRUE) when there are no more data to be read from an input file stream, and zero (meaning FALSE) otherwise. Rules for using end-of-file (eof( )): 1. Always test for the end-of-file condition before processing data read from an input file stream.
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) }
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))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With