Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 869
assassin Avatar asked Feb 12 '10 11:02

assassin


People also ask

Does Getline read EOF?

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.

What does Getline return at end-of-file C++?

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.

How do I use Getline with delimiter?

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!

What is end-of-file character in C++?

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.


2 Answers

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) } 
like image 177
AProgrammer Avatar answered Nov 07 '22 19:11

AProgrammer


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)) 
like image 25
Manuel Avatar answered Nov 07 '22 21:11

Manuel