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):
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
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
Difference Between Function Template and Template Function
C++11 Std::To_String(Double) - No Trailing Zeros
When How to Use a Forward Declaration
Why Do We Need Virtual Functions in C++
How to Convert a Std::String to Const Char* or Char*
How to Convert Between Big-Endian and Little-Endian Values in C++
The Static Keyword and Its Various Uses in C++
Reflection and Refraction Impossible Without Recursive Ray Tracing
Is Meyers' Implementation of the Singleton Pattern Thread Safe
Explicit Template Instantiation - When Is It Used
C++: How to Iterate Over Each Char in a String
Templated Check For the Existence of a Class Member Function
Why Does an Overridden Function in the Derived Class Hide Other Overloads of the Base Class
Function Pointer to Member Function