私はEOTがASCIIコード4で、EOFが-1(少なくともCでは)でエンコードされていることを知っています。私はEOFが-1にマッピングされるという事実を見つけるまで、EOTの同義語だと思いました。 EOFがEOTの代わりに-1にマッピングされるのはなぜですか?私が知っている限り、彼らはすべてファイルストリームを終了するのと同じことをします。私が見ることができる唯一の違いは、EOTがbashシェルでもコマンドを終了することです。私はこれら2つのコードの正確な技術的違いを説明したいと思います。
答え1
通常、EOFは文字ではありません。足りない文字です。
プログラムがデフォルト設定を使用して標準モード(つまりstdioのみを使用する純粋なCプログラム)の端末で実行されている場合、ASCII文字EOTは表示されません。ターミナルドライバはこの文字を認識し、EOF条件(低レベルではゼロ戻り値read()
)を生成します。 stdioライブラリは、このEOF条件を関連関数(EOF
forのマクロgetchar()
、nullポインタfgets()
など)に適した戻り値に変換します。
マクロの数値は、Cライブラリを除くEOF
どこにも関係なく、EOF条件の意味を理解することには影響しません。
答え2
EOF
Cの文脈ではファイルに現れないのです。EOT
メッセージの終わりを表すために使用されるASCII文字であり、ストリームの終わりを表すUNIX端末の特殊文字です。ユーザー入力にのみ表示される場合)、しかし、ファイルに表示される可能性があるので、Cでファイルの終わりを表すためにそれを使用するのは、バイナリファイルを読むときには悪い考えです!
答え3
EOTは、シリアルデバイスで使用される多くの制御文字の1つです。シリアルラインを介してデータを転送したり、紙テープなどのシリアルソースにファイルを保存したりする他の多くの制御文字があります。これには、SOH、STX、ETX、FS、RS、GS、USなどの文字が含まれます。送信制御およびエラー訂正には、追加の制御文字が使用されます。
シリアル接続では、送信終了(EOT)文字は転送終了を示します。シリアル接続は通常、ファイルドライバを使用してアクセスされます。シリアル転送が完了すると、ファイルドライバはそれをファイル終了(EOF)条件として報告します。
EOFは文字ではありません。 getchar() は整数を返します。 0〜255の範囲の値を持つ間に有効な文字。値-1は通常、Unix / Linuxのfalse / invalid / failインジケータとして使用されます。 (実際には失敗の理由が多いため、ゼロ以外の値ですが、通常成功事例は一度だけです。) getchar() が -1 を返した場合、明らかに文字は返されません。ただし、出力をバイト単位で保存すると、EOFとDEL(削除)文字を区別することはできません。