Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

fgetc(): Is it enough to just check EOF?

Tags:

c

file-io

In various examples found on the web fgetc() is used like this:

FILE *fp = fopen(PATH, "r");

if (fp == NULL) {
    perror("main");
    exit(EXIT_FAILURE);
}

int ch;

while (ch = fgetc(fp) != EOF) {
    // do something
}

But according to the manpage to fgetc()

If a read error occurs, the error indicator for the stream shall be set, fgetc() shall return EOF, [CX] and shall set errno to indicate the error.

So need I check this too? And how?

like image 257
helpermethod Avatar asked Nov 27 '10 16:11

helpermethod


1 Answers

This is what the specs say:

the fgetc() function shall obtain the next byte as an unsigned char converted to an int

The following macro name shall be defined as a negative integer constant expression: EOF

As long as you store the return value in an int and not a char, it is sufficient to check for EOF because it is guaranteed not to represent a valid character value.


Also, in your code, this:

while (ch = fgetc(fp) != EOF)

should be:

while ((ch = fgetc(fp)) != EOF)

The additional parentheses are required because != has higher precedence than =.

like image 82
casablanca Avatar answered Oct 22 '22 20:10

casablanca