EOFが理解できない。

という2chの過去ログが偶然検索に引っかかってきた。
http://piza.2ch.net/tech/kako/976/976638476.html
いろいろ参考になることが書いてあったのでメモ。

EOFは文脈によって3つの意味がある
1)EOFマクロ(#define EOF)
2)ファイルの終端(End Of File)
3)MS-DOSファイルのEOFコード

1)EOFマクロ(#define EOF)
 これはgetc, fgetc, getcharなどの
 ストリームから1文字取得する機能を持つ関数が
 ストリームの終わりにくるか(要するにファイルの終端)、
 読込みエラーが発生した場合に返される値である
 ※エラーで中断したかファイル終端まで読んだかの厳密な判定
  を行なう場合はfeof, ferrorを行なう場合もある
 EOFマクロは大概の処理系では-1に定義されている

2)ファイルの終端(End Of File)
 ストリームの終わり
 ストリームからデータの取得を行なうその他の関数(fread, fgets etc)
 は、ファイル終端まで読んだかを判定するのにはEOFマクロは使わない

3)EOFという文字コードは0x1Aなので、
MS-DOSファイルのEOFコードは1Ahである」
は間違いじゃ無いでしょうね。英語もほぼ同じ事を言っています。
ここでいうEOFコードというのは、「ここがファイルの終わりだよ」と
作成者が親切に?付けるものなので、その気になれば1つのファイルに
EOFコードをたくさん書くことも可能です。

しかし、標準ライブラリ関数が返すEOF(-1)は、
「ファイルの終わりまで読んだよ」という意味です。
テキストモードで開いた場合、0x1Aを読むとfgetc()などはEOFを返しますが、
バイナリモードで開いた場合、ファイルの本当の最後に行き当たって初めてEOFが返ります。

全く同じ"EOF"という文字で表されるので非常にわかりにくいのですが、
プログラム上で使用するEOFと、ファイルの中にあるEOFコードとは
別物であり、定義が違う事に注意しましょう。

^Dでストリームが終了するのは shellじゃなくて
ttyドライバのおかげだよ。
sttyで設定できるものはttyの範疇

ちなみに DOSの ^Zは driverじゃなくて applicationが
扱わなきゃいけない点で、Unixの ^Dとは違ったような。
DOSの C libraryはそこを頑張ってごまかしてくれるけど。

ASCII文字コード : IT用語辞典
EOT 4 04 0x04
SUB 26 032 0x1a

http://e-words.jp/p/r-ascii.html

ちなみにASCII文字コードでは、^DがEOT、^ZがSUBってなってた。