1. ホーム
  2. c

C言語のファイル終端(EOF)

2023-08-30 08:37:14

質問

現在、Ritchie & KernighanのC Programming Languageという本を読んでいます。でのEOFの使い方について、かなり混乱しています。 getchar() 関数のEOFの使い方についてかなり混乱しています。

まず、なぜEOFの値が-1なのか、そしてなぜ getchar()!=EOF 私の質問で申し訳ありませんが、私は本当に理解していません。私は本当に試みたが、私はできません。

それから、下のコードで文字数を数えることができる本の例を実行してみましたが、エンターキーを押してもループから抜け出せないようなので、いつEOFになるのかが気になるところです。

main(){
   long nc;
   nc = 0;
   while (getchar() != EOF)
       ++nc;
   printf("%ld\n", nc);
}

次に、同じ問題を C言語におけるEOFの問題 . 多くの人が、EOFを使う代わりに、ターミネータ(終端記号)の "閾値 "かヌルターミネータ "閾値0 "を使えとアドバイスしていて、とても理にかなっていると思いました。

本に載っている例は別の目的を持っているということでしょうか?

どのように解決するのですか?

EOFは"end of file"を表します。改行 (これは Enter キーを押したときに起こるものです) は ファイルの終わりではありません。 の終わりではありません。 であり、改行ではこのループは終了しません。

コードは間違っていません[*] が、あなたが期待していることを行っていないだけです。入力の終わりまで読みますが、あなたは行の終わりまでしか読みたくないようです。

のどの戻り値とも異なっていなければならないので、EOF の値は -1 です。 getchar の戻り値が実際の文字である場合とは異なるためです。ですから getchar は任意の文字値をunsigned charとして返し、intに変換されるため、負でない値になります。

ターミナルで入力しているときに、end-of-file を発生させたい場合は、CTRL-D (unix-style systems) または CTRL-Z (Windows) を使用します。そして、すべての入力が読み込まれた後に getchar() が返されます。 EOF を返し、その結果 getchar() != EOF は偽となり、ループは終了します。

[*] さて、入力がLONG_MAX文字以上の場合、整数のオーバーフローにより未定義の動作となりますが、簡単な例であれば許せるでしょう。