It is possible for an implementation to meet the interface requirements for fgetc
and fputc
even if sizeof(int) == 1
.
The interface for fgetc
says that it returns the character read as an unsigned char
converted to an int
. Nowhere does it say that this value cannot be EOF
even though the expectation is clearly that valid reads “usually” return positive values. Of course, fgetc
returns EOF
on a read failure or end of stream but in these cases the file’s error indicator or end-of-file indicator (respectively) is also set.
Similarly, nowhere does it say that you can’t pass EOF
to fputc
so long as that happens to coincide with the value of an unsigned char
converted to an int
.
Obviously the programmer has to be very careful on such platforms. This is might not do a full copy:
void Copy(FILE *out, FILE *in)
{
int c;
while((c = fgetc(in)) != EOF)
fputc(c, out);
}
Instead, you would have to do something like (not tested!):
void Copy(FILE *out, FILE *in)
{
int c;
while((c = fgetc(in)) != EOF || (!feof(in) && !ferror(in)))
fputc(c, out);
}
Of course, platforms where you will have real problems are those where sizeof(int) == 1
and the conversion from unsigned char
to int
is not an injection. I believe that this would necessarily the case on platforms using sign and magnitude or ones complement for representation of signed integers.