You can't cast the return value to char because the return value could be EOF
, and EOF
value is system-dependent and is unequal to any valid character code. link
Usually it is -1
but you should not assume that.
Check this great answer from the c-faq-site:
Two failure modes are possible if, as in the fragment above, getchar's
return value is assigned to a char.
If type char is signed, and if EOF is defined (as is usual) as -1, the
character with the decimal value 255 ('\377' or '\xff' in C) will be
sign-extended and will compare equal to EOF, prematurely terminating
the input. (assuming 8 bits char).
If type char is unsigned, an actual EOF value will be truncated (by
having its higher-order bits discarded, probably resulting in 255 or
0xff) and will not be recognized as EOF, resulting in effectively
infinite input.
Hope it helps!
Edited: (added the @FatalError comment on this answer, this is explained on the c-faq site but this looks more clear to me)
"If you cast it to char then EOF takes the same value as some valid character and hence becomes indistinguishable from that character. That alone should be enough justification to not make the result a char" @FatalError comment.
feof()
so it is not a duplicate of "while (!feof(file))
is always wrong". – Vanguard