问题
On another question, Jerry Coffin pointed out the following:
It's (probably) not really related to your question, but
while (!feof(fileptr)){
is pretty much a guaranteed bug.
I figured I would start a separate question since that comment is somewhat off-topic. Could someone explain this to me? This was the first program I've written in straight C before.
回答1:
The reason for this statement is that feof
is still (initially) false when the end of the file has been reached -- it only becomes true after the first failed attempt to read past the end of the file.
Hence
char mychar;
while(!feof(fileptr))
{
fread(&mychar, sizeof(char), 1, fileptr);
fprintf(stderr, "The char is '%c'.\n", mychar);
}
will process one char too many.
The correct way is to check the return value of fread
(or whatever function you're using to read) or, alternatively, to call feof
after the function that does the reading. For example:
char mychar;
while(fread(&mychar, sizeof(char), 1, fileptr) > 0)
fprintf(stderr, "The char is '%c'.\n", mychar);
回答2:
Google finds this: http://www.drpaulcarter.com/cs/common-c-errors.php#4.2
It says "The author has yet to see any student use the feof() function correctly!"
To summarize, the C file functions like fread
and fwrite
return status values anyway which you <blink>should not ignore</blink>. Checking the value of feof
is one of those bolting the stable door after the horse has already fled kind of things.
回答3:
The C FAQ list has an answer along with answers to many other such frequently asked questions:
In C, end-of-file is only indicated after an input routine has tried to read, and failed.
来源:https://stackoverflow.com/questions/1588336/why-is-this-c-code-buggy