HiveBrain v1.2.0
Get Started
← Back to all entries
patterncppCritical

Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
whilestreamconditioninsidewhyconsideredloopwrongeofiostream

Problem

I just found a comment in this answer saying that using iostream::eof in a loop condition is "almost certainly wrong". I generally use something like while(cin>>n) - which I guess implicitly checks for EOF.

Why is checking for eof explicitly using while (!cin.eof()) wrong?

How is it different from using scanf("...",...)!=EOF in C (which I often use with no problems)?

Solution

Because iostream::eof will only return true after reading the end of the stream. It does not indicate, that the next read will be the end of the stream.

Consider this (and assume then next read will be at the end of the stream):

while(!inStream.eof()){
  int data;
  // yay, not end of stream yet, now read ...
  inStream >> data;
  // oh crap, now we read the end and *only* now the eof bit will be set (as well as the fail bit)
  // do stuff with (now uninitialized) data
}


Against this:

int data;
while(inStream >> data){
  // when we land here, we can be sure that the read was successful.
  // if it wasn't, the returned stream from operator>> would be converted to false
  // and the loop wouldn't even be entered
  // do stuff with correctly initialized data (hopefully)
}


And on your second question: Because

if(scanf("...",...)!=EOF)


is the same as

if(!(inStream >> data).eof())


and not the same as

if(!inStream.eof())
    inFile >> data

Code Snippets

while(!inStream.eof()){
  int data;
  // yay, not end of stream yet, now read ...
  inStream >> data;
  // oh crap, now we read the end and *only* now the eof bit will be set (as well as the fail bit)
  // do stuff with (now uninitialized) data
}
int data;
while(inStream >> data){
  // when we land here, we can be sure that the read was successful.
  // if it wasn't, the returned stream from operator>> would be converted to false
  // and the loop wouldn't even be entered
  // do stuff with correctly initialized data (hopefully)
}
if(scanf("...",...)!=EOF)
if(!(inStream >> data).eof())
if(!inStream.eof())
    inFile >> data

Context

Stack Overflow Q#5605125, score: 622

Revisions (0)

No revisions yet.