The EOF macro represents a negative value that is used when reading data from a file. It is used to indicate that the file is exhausted and no data remains when reading data from a file. EOF is an example of an in-band error indicator. In-band error indicators are problematic to work with, and the creation of new in-band-error indicators is discouraged in ERR02-C. Avoid in-band error indicators.
The character I/O functions fgetc(), getc(), and getchar() all read a character from a stream and return it as an int. If the stream is at end-the end of -the file, the end-of-file indicator for the stream is set and the function returns EOF. If a read error occurs, the error indicator for the stream is set and the function returns EOF. If these functions succeed, they cast the character returned into an unsigned char. Because EOF is negative, it should not match any unsigned character value. However, this is only true for platforms where the int datatype has more precision bits than char. On a platform where int and char have the same sizeprecision, then a character-reading function could return EOF because it matched the value of the last character read. The C Standard requires only that an int type be able to represent a maximum value of +32767 and that a char type be no larger than an int. Although uncommon, this situation can result in the integer constant expression EOF being indistinguishable from a normal character; that is, (int)(unsigned char)65535 == -1. Consequently, failing to use feof() and ferror() to detect end-of-file and file errors can result in incorrectly identifying the EOF character on rare implementations where sizeof(int) == sizeof(char).
...
Note that in the UTF-16 character set, 0xFFFF is guaranteed not to be a character, which leaves room for EOF WEOF to be chosen as the value −1. In 16-bit EUC (Extended UNIX Code), the high byte can never be 0xFF, so a conflict cannot occur at all. Similarly, all UTF-32 characters are positive when viewed as a signed 32-bit integer. Consequently, it would require a custom character set designed without consideration of the C programming language for this problem to occur with wide characters.
See STR00-C. Represent characters using an appropriate type for more information on the proper use of character types.
C11 C provides the feof() and ferror() to detect end-of-file and file errors. These functions are not subject to the problems associated with character and integer sizes, and are preferred over EOF or WEOF [Kettlewell 2002].
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <assert.h>
#include <stdio.h>
void func(void) {
int c;
assert(PRECISION(UCHAR_MAX) < PRECISION(INT_MAX));
do {
c = getchar();
} while (c != EOF);
}
|
Noncompliant Code Example (Wide
...
Characters)
In this noncompliant example, the result of the call to the C standard library function getwc() is stored into a variable of type wchar_t, and is subsequently compared with WEOF:
...
FIO34-EX1: A number of C functions do not return characters but can return EOF as a status code. These functions include fclose(), fflush(), fputs(), fscanf(), puts(), scanf(), sscanf(), vfscanf(), and vscanf(). It is perfectly correct valid to test these return values with EOF.
...