• ベストアンサー

fgets関数のEOFの扱い方について

fgets関数のEOFの扱い方って、 ファイルの終わり(EOF)を検出し、かつ配列に1文字も読み取れなかった場合、配列の内容を変化させずに残しNULLを返す。配列に1文字以上読み取れた場合、EOFをバッファに残し配列に'\0' を追加する。その後、EOFを読み取り終了。 であってますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★回答者 No.1 です。追記。 ・回答者 No.2、No.3 さんの通り『EOF』は『EOFコード(^Z)』をバッファに  残すわけではありませんよ。→イメージ的には『あっている』のですよ。あくまで。 ・厳密には、回答者 No.3 さんのアドバイスどおりです。 ・つまり、『fgets』関数で1文字も読み取れなかった場合には、『ファイル終了』  というフラグ情報をセットするのです。→EOFをバッファに残す感じですね。 ・そのため、次に読み込んだ場合に、このフラグ情報を『EOF』として読み取って  終了するわけです。→『fgetc』関数も同じ仕組みです。 ・また、途中でエラーが発生した場合にも『fgets』関数は『NULL』を返します。 ・この場合は、『エラー発生』のフラグ情報をセットしてから『NULL』を返すのです。 ・よって『NULL』が返される多くの場合は、『ファイル終了』ですが、エラーが発生  しても『NULL』が返されます。そこで、『feof』関数や、『ferror』関数でどちらか  判定するわけです。feof(fp) や ferror(fp) で 0 以外が返されたら『ファイル終了』  や『エラー発生』と判別します。→厳密にエラー発生の対策をする場合はね。 ・あと、一度『エラー発生』のフラグがセットされると『fseek』関数などではその  情報はクリアされません。→『clearerr』関数でクリアします。 ・『ファイル終了』情報はファイル・ポインタの位置を変える『fseek』関数などで  その情報がクリアされます。 ・『ファイル終了』、『エラー発生』のフラグ情報などは、それぞれのファイル  ポインタで管理されています。 最後に: ・イメージ的には、最後に『EOFを読み取り終了』という事になります。 ・質問者さんは、プログラムや、テストプログラムを作って動作に疑問を持ったのですね。  そうでないと、『EOF』を検出して、1文字も読み取れなかった場合、配列内容が変化  しない事を推測できませんものね。 ・そこで、最後にアドバイスします。 ・疑問があったら簡単なテスト・プログラムを作ってみて確認することがとても大事ですよ。  動作確認すると『fgets』関数などの仕組みをより理解できますから。 ・以上。おわり。

hiroki239
質問者

お礼

大変、分かりやすかったです。どうもありがとうございます。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 配列に1文字以上読み取れた場合、EOFをバッファに残し配列に'\0' を追加する。 EOFをバッファに残すのではなく、「ファイル終了表示子」をセットすることになります。 ちなみに、fgets関数がNULLを返すのは、EOFに達した場合だけではありません。読み込み途中にエラーが発生した場合にもNULLを返しますが、その場合は「エラー表示子」をセットし、配列の内容は不定になります。

hiroki239
質問者

お礼

非常に、参考になりました

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

EOFはキャラクタではないので、EOFがバッファに格納されることはないと思います。 DOS/Windows形式だと^Z がEOFを表すキャラクタとしてファイル中に存在する場合がありえますが、 その場合でも^Z自身がバッファに格納されることはなかったと思います。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★回答 ・はい、あっていますよ。 ・きちんと理解しているようですね。 ・以上。おわり。

hiroki239
質問者

お礼

本当に、ありがとうございます。

関連するQ&A