Defect Report #141
Submission Date: 10 Sep 94
Submittor: Project Editor (P.J. Plauger)
Source: Doug McIlroy
Question
What does EOF mean in <stdio.h>? Subclause 7.9.1 says 
that it ``is returned by several functions to indicate end-of-file, 
that is, no more input from a stream.''
Taken at face value, the statement that there is no more input implies 
that further reads from the stream will yield EOF. In many implementations 
this is not true. It may be possible to read data from a stream on 
which the end-of-file indicator is set. Just whether that happens 
usually depends on what kind of file the stream is associated with. 
In System V, for example, one will almost always get more data on 
reading past EOF on a terminal, and almost never on a plain 
file. This violates the principle of device-independent behavior.
I believe the System V behavior is wrong. Whenever feof would 
return nonzero, getc should return EOF.
Some old code will break if EOF is made sticky as I suggest, 
but surprisingly little. When we made it sticky in v10 UNIX, we had 
to change exactly one dishonest program (sdb), which used ctl-D as 
if it were a character without putting the terminal in raw mode. Not 
one complaint arose from the change.
On the other hand, almost every UNIX user has at one time or another 
been surprised by a nonsticky EOF, manifested as a program needing 
more than one EOT to stop it when stdin comes from a terminal. 
That breeds the habit of typing extra EOT at balky programs. 
The habit causes yet more trouble (hangup, for example), when things 
are merely slow and not really balky. This indefinite-EOF problem 
is not the fault of the programs, which should be able to count on 
a uniform behavior of EOF across all files. It is a fundamental 
mistake in the implementation of <stdio.h>.
I urge the Committee to clarify EOF, and clarify it in the direction 
of predictability.
Response
It was certainly the intent of the Committee that end-of-file should 
indicate ``no more input from a stream,'' at least when returned 
by functions such as fgetc. In particular, subclause 7.9.7.1 
The fgetc function says, in part:
If the stream is at end-of-file, the end-of-file indicator for 
the stream is set and fgetc returns EOF.
``Setting the end-of-file indicator'' implies that
that stream is now considered to be ``at end-of-file.''
For input from a stream
to return other than EOF after once returning 
EOF (with no intervening file-positioning operations
or calls to clearerr)
is non-conforming behavior, however widespread.
Previous Defect Report
< - > 
Next Defect Report