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用語辞典
http://e-words.jp/p/r-ascii.html
EOT 4 04 0x04
SUB 26 032 0x1a
ちなみにASCII文字コードでは、^DがEOT、^ZがSUBってなってた。