EOF in Windows command prompt doesn’t terminate input stream

This is true in almost every terminal driver. You’ll get the same behavior using Linux.

Your program isn’t actually executing the loop until \n or ^z has been entered by you at the end of a line. The terminal driver is buffering the input and it hasn’t been sent to your process until that occurs.

At the end of a line, hitting ^z (or ^d on Linux) does not cause the terminal driver to send EOF. It only makes it flush the buffer to your process (with no \n).

Hitting ^z (or ^d on Linux) at the start of a line is interpreted by the terminal as “I want to signal EOF”.

You can observe this behavior if you add the following inside your loop:

printf("%d\n",ch);

Run your program:

$ ./test
abc                      <- type "abc" and hit "enter"
97
98
99
10
abc97                    <- type "abc" and hit "^z"
98
99

To better understand this, you have to realize that EOF is not a character. ^z is a user command for the terminal itself. Because the terminal is responsible for taking user input and passing it to processes, this gets tricky and thus the confusion.

A way to see this is by hitting ^v then hitting ^z as input to your program.

^v is another terminal command that tells the terminal, “Hey, the next thing I type – don’t interpret that as a terminal command; pass it to the process’ input instead”.

Leave a Comment