• ベストアンサー

EOFについて

C言語学習中です。基本と思いますが、お分かりの方教えて下さい。 ファイルの終了記号「EOF(=-1)」っていつ誰が書くのでしょうか。 (書き込み後、fcloseする時でしょうか。) 例えば'A','B','C'をputcでファイルに書き込んで、getcで読み出すとABCの次は-1になっていることはわかりますが。

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

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

★ファイルの終了記号『EOF=(-1)』はファイル内に書き込みません。 ・その代わりに Windows などの OS がファイルのサイズを管理していて、そこへの情報を  書き込むことになります。→書き込み後の『fclose』関数などが行っている事になる。 ・質問者さんの例えで行くと『A』『B』『C』という3バイトがファイル・サイズとして、  OS の管理しているファイル情報に記録されます。 ・それで今度は『getc』関数などで読み出すと『A』『B』『C』という3文字(バイト)を  取得しますが、次に1文字を読み出そうとするとOS の管理しているファイル情報より  データがない事が分かるので、終了記号『EOF』を分かりやすく返してくるのです。  決してファイル内に終了記号『EOF』があって、それを読み込んで『EOF=(-1)』を返して  いるわけではありません。→分かりますか?イメージが…。 ・なお、テキストファイルの場合は『^Z=(26)』の文字コードをファイルの終了として処理  する場合があります。昔の MS-DOS という OS ではこれが基本で、ファイルの末尾に『^Z』  を出力して、その後に隠された文章などを記述すると簡単な『秘密文章』が記録できました。  しかし、そのテキストをメモ帳などのソフトで読み込んで上書きすると『秘密文章』をメモリ  に読み込んでいないため削除されてしまいます。→独自のソフトでやり取りする必要があります。 最後に: ・過去に似たような質問がありました。 ・こちらにも『EOF』の詳しい回答を書き込みましたので一度読んでみて下さい。 ・回答者 No.1、No.4 です。→『fgets関数のEOFの扱い方について』 ・以上。おわり。→下の『参考URL』をどうぞ。

参考URL:
http://oshiete1.goo.ne.jp/qa2625434.html
helpcircle
質問者

お礼

とてもよく理解できました。それと、関数が何をやっているかまで理解しないといけないということを感じました。(どれを見たらいいのかはこれから探そうと思います。)ありがとうございました。

その他の回答 (2)

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

少し混乱している気配がしますが... > ファイルの終了記号「EOF(=-1)」っていつ誰が書くのでしょうか。 通常-1に定義されるEOFマクロというのは、ライブラリ関数が返却値として返すものです。これが書き込まれるとすれば、fgetcなどの関数が呼び出し元に戻るとき、あるいは返却値を何らかの変数に代入するときです。 あるいは、FILE型が内部的に管理している「ファイル終了表示子」の意味であれば、fgetcなどの入力関数を呼び出しによって、ファイルの終端に達したときにセットされます。 テキストファイル自体の終端に書き込まれる(ことがある)通常0x1aの値のことであれば、ライブラリ等の実装しだいですが、fclose時に書き込まれる可能性が高いでしょう。

helpcircle
質問者

お礼

-1はライブラリ関数がEOFの返却値として返したもので、読み込んだデータとは違うということが判りました。ありがとうございました。

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

EOFはファイルの中に存在しているのではありません。 細かく言うとOSによってはそういう可能性もなくはないのですが、WindowsとかUNIX類では そうです。 ファイルの長さなどを管理しているので、ファイルの終端はEOFがあるかどうかを見なくても 判断できます。 たとえばgetcの中に潜ると、 何段か下請け関数を通過してOSのシステムコールまでいきます。 OSに「このファイルの次のデータくれ」と要求して、OSから 「んなもんないよ」という返事が来たら、 getcが -1 (EOF)を返しているというだけのことなのです。 Windows/MS-DOSだとテキストモードでオープンすると、0x1aという値のキャラクタを 見つけると そこでファイルの終わりと見なしますが、基本は同じです。

helpcircle
質問者

お礼

よくわかりました。またgetcの中に潜る方法を探さねばとも思いました。ありがとうございました。

関連するQ&A