Why Is Iostream::Eof Inside a Loop Condition (I.E. 'While (!Stream.Eof())') Considered Wrong

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

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

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


is the same as

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

and not the same as

inFile >> data

The while loop should end after reading the third line in my file but why does it run the fourth time? [duplicate]

The problem is the condition in the while statement

        while (!fin.eof())

fin >> f_id;
fin >> delim; // skipping the comma
fin >> u_id;
fin >> delim;
fin >> priority;
fin >> delim;
fin >> acc_type;

The condition fin.eof() can occur within the body of the while loop after already reading the last data.

Either you need to write

        while (fin >> f_id >> delim >> u_id >> delim >>
priority >> delim >> acc_type );

Or it would be much better to read a whole line and then using the string stream to enter various data like

while ( std::getline( fin, line ) )
std::istringstream iss( line );

iss >> f_id;
// and so on

Ifstream failing to interpret EOF [duplicate]

fstream.eof only becomes true when you have passed the end-of-file. The fourth iteration occurs because you have read exactly the contents of the file and have not yet reached the eof.

Related Topics

Leave a reply