Connecting Tech Pros Worldwide Forums | Help | Site Map

while(!FP.eof()) is reading the last data point of the file twice

ramana
Guest
 
Posts: n/a
#1: Dec 25 '07

I'm wondering if someone could point me to the flaw in the following
code that uses the while(!FP.eof()) condition to read the input data.
This condition is reading the last data point of the file twice.

#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
double x;
ifstream FP("test.d");

//while(!FP.eof()){FP >x; cout << x << endl;} // This reads the
last data point of test.d twice
while(FP >x){cout<< x << endl;} // This doesn't.

return 0;
}
/* Using either gcc 3.4.6 or gcc 4.1.3
File "test.d" has the following 2 data points:
1.1
2.2
*/

Thanks...ramana


LR
Guest
 
Posts: n/a
#2: Dec 26 '07

re: while(!FP.eof()) is reading the last data point of the file twice


ramana wrote:
Quote:
I'm wondering if someone could point me to the flaw in the following
code that uses the while(!FP.eof()) condition to read the input data.
Quote:
This condition is reading the last data point of the file twice.
I don't think so.
Quote:
>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
double x;
ifstream FP("test.d");
>
//while(!FP.eof()){FP >x; cout << x << endl;}
// This reads the last data point of test.d twice
Are you sure about that?


Quote:
while(FP >x){cout<< x << endl;} // This doesn't.
I suspect, for many, but not all, apps this would be preferred over the
commented code above.



Quote:
>
return 0;
}
/* Using either gcc 3.4.6 or gcc 4.1.3
File "test.d" has the following 2 data points:
1.1
2.2
*/
>
Thanks...ramana
>
May I suggest that you try this code,

#include <iostream>
#include <fstream>

int main() {
std::ifstream in("junk.txt");
while(!in.eof()) {
double d = 999.;
in >d;
std::cout << d << std::endl;
}
}

And this,
#include <iostream>
#include <fstream>

int main() {
std::ifstream in("junk.txt");
while(!in.eof()) {
double d = 999.;
if(in >d) {
std::cout << d << std::endl;
}
}
}
Daniel T.
Guest
 
Posts: n/a
#3: Dec 26 '07

re: while(!FP.eof()) is reading the last data point of the file twice


ramana <ramana.dodla@gmail.comwrote:
Quote:
I'm wondering if someone could point me to the flaw in the following
code that uses the while(!FP.eof()) condition to read the input data.
This condition is reading the last data point of the file twice.
>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
double x;
ifstream FP("test.d");
>
//while(!FP.eof()){FP >x; cout << x << endl;} // This reads the
last data point of test.d twice
The reason the last data point is "read" twice is this... When the last
data point is read the first time, eof() still false because you haven't
reached the end of the file yet, then it attempts to read another data
point, but none exists, so eof is set to true and x is left unchanged,
so the last data point outputs a second time.
Quote:
while(FP >x){cout<< x << endl;} // This doesn't.
This one works as follows... The last data point is read, then FP is
true so the data point is printed out, then when it goes to read more,
there isn't any os FP returns false and the loop isn't executed anymore.
ramana
Guest
 
Posts: n/a
#4: Dec 26 '07

re: while(!FP.eof()) is reading the last data point of the file twice


Quote:
Quote:
//while(!FP.eof()){FP >x; cout << x << endl;} // This reads the
last data point of test.d twice
>
The reason the last data point is "read" twice is this... When the last
data point is read the first time, eof() still false because you haven't
reached the end of the file yet, then it attempts to read another data
point, but none exists, so eof is set to true and x is left unchanged,
so the last data point outputs a second time.
>
Quote:
while(FP >x){cout<< x << endl;} // This doesn't.
>
This one works as follows... The last data point is read, then FP is
true so the data point is printed out, then when it goes to read more,
there isn't any os FP returns false and the loop isn't executed anymore.
Thank you Daniel... It's very enlightening...ramana
ramana
Guest
 
Posts: n/a
#5: Dec 26 '07

re: while(!FP.eof()) is reading the last data point of the file twice



Thank you LR...
Quote:
May I suggest that you try this code,
>
#include <iostream>
#include <fstream>
>
int main() {
std::ifstream in("junk.txt");
while(!in.eof()) {
double d = 999.;
in >d;
std::cout << d << std::endl;
}
>
}

This code still printed 999 after the contents of junk.txt. It's quite
revealing though...

Quote:
And this,
#include <iostream>
#include <fstream>
>
int main() {
std::ifstream in("junk.txt");
while(!in.eof()) {
double d = 999.;
if(in >d) {
std::cout << d << std::endl;
}
}
>
}
This code worked perfect.
And as Daniel's reply would mean, failing if-condition prevented its
stmnts from executing... Thanks. ramana

red floyd
Guest
 
Posts: n/a
#6: Dec 26 '07

re: while(!FP.eof()) is reading the last data point of the file twice


ramana wrote:
Quote:
I'm wondering if someone could point me to the flaw in the following
code that uses the while(!FP.eof()) condition to read the input data.
This condition is reading the last data point of the file twice.
>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
double x;
ifstream FP("test.d");
>
//while(!FP.eof()){FP >x; cout << x << endl;} // This reads the
last data point of test.d twice
while(FP >x){cout<< x << endl;} // This doesn't.
>
return 0;
}

This is a FAQ, 15.5
http://parashift.com/c++-faq-lite/in....html#faq-15.5

Essentially, C++ doesn't return true until *after* you've read EOF. So
you hit EOF. The subsequent read doesn't change your data, so you get
it twice. Then testing EOF indicates eof.

The FAQ is more eloquent than I am.
Sachin
Guest
 
Posts: n/a
#7: Dec 26 '07

re: while(!FP.eof()) is reading the last data point of the file twice


On Dec 26, 8:22*am, red floyd <no.s...@here.dudewrote:
Quote:
ramana wrote:
Quote:
I'm wondering if someone could point me to the flaw in the following
code that uses the while(!FP.eof()) condition to read the input data.
This condition is reading the last data point of the file twice.
>
Quote:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
*double x;
*ifstream FP("test.d");
>
Quote:
*//while(!FP.eof()){FP >x; cout << x << endl;} * // This reads the
last data point of test.d twice
*while(FP >x){cout<< x << endl;} * * * * * * // This doesn't.
>
Quote:
*return 0;
}
>
This is a FAQ, 15.5http://parashift.com/c++-faq-lite/input-output.html#faq-15.5
>
Essentially, C++ doesn't return true until *after* you've read EOF. *So
you hit EOF. *The subsequent read doesn't change your data, so you get
it twice. *Then testing EOF indicates eof.
>
The FAQ is more eloquent than I am.- Hide quoted text -
>
- Show quoted text -
I think main reason for the above mentioned behaviour is you might be
having SPACE or END OF LINE character at the end of the file.
red floyd
Guest
 
Posts: n/a
#8: Dec 27 '07

re: while(!FP.eof()) is reading the last data point of the file twice


Sachin wrote:
Quote:
On Dec 26, 8:22 am, red floyd <no.s...@here.dudewrote:
Quote:
>ramana wrote:
Quote:
>>I'm wondering if someone could point me to the flaw in the following
>>code that uses the while(!FP.eof()) condition to read the input data.
>>This condition is reading the last data point of the file twice.
>>#include <iostream>
>>#include <fstream>
>>using namespace std;
>>int main(int argc, char **argv)
>>{
>> double x;
>> ifstream FP("test.d");
>> //while(!FP.eof()){FP >x; cout << x << endl;} // This reads the
>>last data point of test.d twice
>> while(FP >x){cout<< x << endl;} // This doesn't.
>> return 0;
>>}
>This is a FAQ, 15.5http://parashift.com/c++-faq-lite/input-output.html#faq-15.5
>>
>Essentially, C++ doesn't return true until *after* you've read EOF. So
>you hit EOF. The subsequent read doesn't change your data, so you get
>it twice. Then testing EOF indicates eof.
>>
>The FAQ is more eloquent than I am.- Hide quoted text -
>>
>- Show quoted text -
>
I think main reason for the above mentioned behaviour is you might be
having SPACE or END OF LINE character at the end of the file.
No, it's because the stream doesn't know it's at EOF until it's actually
*hit* the end of file. READ THE FAQ!!!!!

http://parashift.com/c++-faq-lite/in....html#faq-15.5

Closed Thread