そのgetchar()の返すEOFとファイルに入ってる0x1a(Ctrl-Z)は別のもんなの。
getchar()の返すEOFはライブラリが定義しているリターンコードであって、0x1aとは別物。
ちなみに、Windows(つーか、MS-DOS)のファイルなんかは、0x1aを実際にファイルの末尾に
書き込むんだけどね。UNIXにはそういうことはない。