Re: Trouble with eof()
Sherrie Laraurens wrote:
Hi all,
I'm having some difficulty understanding the difference in
interpratation of the fstream's eof() method.
I basically try and read a file in and count the number of
characters I read in, using the code in the main routine I
always get one more (count1) than the second count I get
from using the code in load file.
Even when the file is empty, the eof() for the first loop
round returns true, which i believe is somewhat incorrect.
void loadfile(const std::string& file_name, std::string& buffer)
{
std::ifstream file(file_name.c_str(), std::ios::binary);
if (!file) return;
buffer.assign(std::istreambuf_iterator <char>(file),
std::istreambuf_iterator <char>());
file.close();
}
Correct code, though there's no need for close()ing the fstream and it lacks
error-signalling. Other than that, take a look at std::distance if you just
need the length.
void main()
Please read the FAQ.
unsigned int count = 0;
while (!file.eof())
{
file.get();
count++;
}
Now, this code is broken. The point is that eof() only returns true if
(during some operation) the end of the file was encountered, so you need to
check between calling get() and incrementing the counter. Alternatively,
you could check the returnvalue of get() whether it matches the eof value
defined in the char_traits (IIRC, need to look it up).
Idiomatic IOStream input then looks like this in C++:
while(true) {
in >> record;
if(in) {
handle(record);
continue;
}
if(in.eof())
// okay, reached end of file
break;
// not okay, parsing error
throw std::runtime_error("invalid stream content");
}
The short form, using the implicit conversion of a stream to a void* (which
then can be used as boolean) is this:
while( in >> record)
handle(record);
if(!in.eof())
// not okay, parsing error before end of file
throw std::runtime_error("invalid stream content");
I was just hoping someone on this list could explain to me
why eof doesn't work the way i'm thinking it should be working,
and if there is anyplace in the standards that describes how
eof should work, when it should return true and when it should
return false.
Well, I dare say that any better documentation says that this memberfunction
returns true when an input operation failed (note the past tense) due to
reaching EOF. It's probably just that it doesn't do what you would expect
it to do. ;)
Uli
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]