Search code examples
cfile-iowhile-loopfeof

Why is this C code buggy?


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.


Solution

  • 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);