• ベストアンサー

EOF

 ふと思ったのですが、 バイナリファイルの中の途中のデータが EOFと認識されないのはどんな仕組みなのでしょうか?  私の理解は バイナリファイルはどんなデータも書き込める。 なのです。  途中にEOFと認識されるようなデータが 書き込まれることは無いのかな? と思ったのです。

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

  • ベストアンサー
  • S-Fuji
  • ベストアンサー率36% (592/1624)
回答No.1

バイナリデータの中に「EOF」が入っている場合それを「EOF]と認識してしまうと、その後のデータを読めね九なってしまいます。  そこで、データの容量をチェックして総てのファイルを処理するようにしているのです。

uyama33
質問者

お礼

ありがとうございました。 char c = fgetc(...); if(c == EOF){.... のように、 して不安定なエラーが出て、 ぎもんがしょうじたのです。  もちろん int c = fgetc(...); if(c == EOF){.... と修正したら エラーは出なくなったのですが、  EOFとは何だろう? と思ったのです。 みなさまもおかげですっきりいたしました。 ありがとうございました。

その他の回答 (5)

  • shige_70
  • ベストアンサー率17% (168/946)
回答No.6

EOF=0x1aというのはDOSのテキストファイルの話です。 一般にCのライブラリ関数でEOFが返ってくるのは、単純に『読み込むデータがなくなった』ときです。 いわゆるバイナリファイルも当然大きさは有限ですから、順繰りに読んでいけばいつかはファイルの終端に達し、読むべきデータがなくなります。そうすると、読み込み関数はEOF(もしくはNULL)を返すのです。 逆に、途中のデータを読んでいて、その先にまだデータが残っている限り、EOFとは認識されないわけです。 ちなみに、C言語の世界でEOFの実体は -1 です。もちろん実際のファイルに-1というデータが入っているわけではありません。

uyama33
質問者

お礼

ありがとうございました。 char c = fgetc(...); if(c == EOF){.... のように、 して不安定なエラーが出て、 ぎもんがしょうじたのです。  もちろん int c = fgetc(...); if(c == EOF){.... と修正したら エラーは出なくなったのですが、  EOFとは何だろう? と思ったのです。 みなさまもおかげですっきりいたしました。 ありがとうございました。

  • hideo2004
  • ベストアンサー率35% (68/189)
回答No.5

Windowsの場合、ファイルをテキストモードでオープンした場合、ファイル中の"0x1a"をEOFと扱います。 したがって、ファイルをオープンしたときのモードによってEOFの扱いが違ってきます。 なお、UNIXにはテキストモードはありません。

uyama33
質問者

お礼

ありがとうございました。 char c = fgetc(...); if(c == EOF){.... のように、 して不安定なエラーが出て、 ぎもんがしょうじたのです。  もちろん int c = fgetc(...); if(c == EOF){.... と修正したら エラーは出なくなったのですが、  EOFとは何だろう? と思ったのです。 みなさまもおかげですっきりいたしました。 ありがとうございました。

回答No.4

そもそもEOFとはデータではないのでは? バイナリファイルと言っても1byteのデータは0~255の値なので、fgetc関数などを用いたときEOFと区別がつけられるのではないでしょうか?

noname#25358
noname#25358
回答No.3

 ちなみに、最近はテキストファイルでもEOFが書き込まれてないことが多いです。  ファイルのサイズ情報を見れば、どこでファイルが終了するのか一目瞭然ですから、わざわざ入れる必要がないというわけです。

uyama33
質問者

お礼

ありがとうございました。 char c = fgetc(...); if(c == EOF){.... のように、 して不安定なエラーが出て、 ぎもんがしょうじたのです。  もちろん int c = fgetc(...); if(c == EOF){.... と修正したら エラーは出なくなったのですが、  EOFとは何だろう? と思ったのです。 みなさまもおかげですっきりいたしました。 ありがとうございました。

  • hideo2004
  • ベストアンサー率35% (68/189)
回答No.2

バイナリモードでファイルを読んでいる場合、EOFの検出はファイル内のデータとは関係ありません。 読み込みで、ファイルの最後に到達し、それ以上読み込むデータが無くなったときにEOFとなります。

uyama33
質問者

お礼

ありがとうございました。 char c = fgetc(...); if(c == EOF){.... のように、 して不安定なエラーが出て、 ぎもんがしょうじたのです。  もちろん int c = fgetc(...); if(c == EOF){.... と修正したら エラーは出なくなったのですが、  EOFとは何だろう? と思ったのです。 みなさまもおかげですっきりいたしました。 ありがとうございました。

関連するQ&A