• ベストアンサー

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

  • VBでEOF(0x1a)の検出方法

    VBでCSVファイルを取得したいのですが、EOFの検査をしなければなりません。 ファイルの最後にEOFの制御コードとして、0x1aがはいっているかどうかどのように 調べればわかるでしょうか? やはり バイナリで検査するのが適当でしょうか? サンプルなどありましたら、ありがたいのですが・・・。 初心者です。よろしくお願い致します。

  • 標準I/OからのEOFの入力

    iBook(OSX)のプロジェクトビルダーでcarbonのファイルを作っています。プログラムの中で  getchar() != EOF という文で入力がEOFかどうかを検出しようとしているのですがreturnやenterではEOFと認識されないようです。標準I/O (キーボード)からEOFを入力するにはどうしたら良いのでしょうか。

    • 締切済み
    • Mac
  • 途中にEOFがあるファイルの読込

    VB6でファイルを全行読み込んで任意の処理を行いたいのですが、そのファイルには 途中に文字コード 1a (つまりEOF)が入っている場合があります。 普通に Line Input で処理すると、その部分でファイル終了と判断し 読込を終えてしまいますが、その後のデータも読み込みたいのです。 どのようにすれば良いのでしょうか?

  • EOFについて

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

  • EOF判定されない

    if(fgets(buff, 21, fp) == NULL) {   if(!feof(fp))   {     rtn_code[0] = '8';   }   else   {     rtn_code[0] = '4';   } } -------------------------------------- /入力ファイル/ -------------------------------------- 1行目 AAAAABBBBBCCCCCDDDD[LF] 2行目 EEEEEFFFFFGGGGGHHHH[LF] 3行目 [EOF] -------------------------------------- [LF]=改行文字です。 [EOF]=ファイル終端指示子です。 上記のプログラムは、 1行20バイトある入力ファイルから一行だけgetするサブモジュールの一部です。 3回目にこれを実行した時に、EOFになってrtn_codeが'4'で返ってくる予定なのですが、どうしても非EOFになって'8'が返ってきてしまうのです。 なぜなんでしょうか? そもそも、どうなるとEOF指示子がfpに返ってくるのでしょう?

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

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

  • EOFの書き込み Perl

    CGI初心者です。質問させてもらいます。 テキストファイルを読み書きモードでオープンします。 open(FILE, "+<test.txt"); 読み込みや書き込み作業をした後、 現在のファイルポインタの位置や、 seek FILE, 0, 0; などファイルの先頭で、 EOFを書き込めないのでしょうか? 例)print FILE 'EOFの文字'; Cでは出来たような気がしましたが・・ ファイルポインタの位置でファイルを終わらせる 簡単な方法ありましたら、お教え願います。m(__)m

    • ベストアンサー
    • CGI
  • 続・EOF判定されない

    前回「EOF判定されない」で回答、アドバイスしていただいた a-kumaさん、Haizyさん、inthefloiさん、anisolさん、leaz024さん、cherry-moonさん 本当にありがとうございました。頂いたアドバイスを試行してみましたが、なぜか、ダメでした。(T-T) 環境が悪いのかもしれませんね。 あれから、feof関数を使わずにファイルの終わりを算出して判定するなどの方法を試みましたが、EOF判定だけのために妙に複雑になってしまい、自分でも納得がいかなかったので、再度こちらで皆さんの意見をもらおうと投稿させてもらいました。 今回は質問の仕方を変えて、モジュールの仕様を挙げますので、それから「自分ならこうする」というようなお答えを頂けたらと思っています。 feof関数を使用しても、その他の方法でもなんでもアリです。(^^) 「ファイル一行入力モジュール」(仕様) 1.このモジュールは実行されると「inputfile.txt」から一行だけ(改行まで)読み込み、終了します。次に実行された時は、その次の行を読み込みます。 2.ファイルの終端に達したら、リターンコードに'4'を設定し、終了する。 以上これだけ。(^^; 「inputfile.txt」(仕様) インプットファイルは、テキストファイルで、一行30バイトの文字列を格納しています。ファイルの総バイト数は不定です。 文字コードは「Shift-JIS」「改行=CR+LF」、ファイルの最後にEOF制御文字を設定しています。 「インプットファイルの内容」  1行目 AAAAAAAAAABBBBBBBBBBCCCCCCCCC[改行文字]  2行目 DDDDDDDDDDEEEEEEEEEEFFFFFFFFF[改行文字]           ・           ・           ・ n-1行目 XXXXXXXXXXYYYYYYYYYYZZZZZZZZZ[改行文字]  n行目 [EOF] 「ここはこうしたらいいんじゃないかな?」的な事でかまいませんので、是非みなさんの意見を聞かせてください。

  • ファイルの終端(EOF)を越えています

    CUEファイルをデーモンでマウントした際に 『イメージをマウント出来ません。INDEX時間がファイルの終端(EOF)を越えています』 とエラーが出てきます。 メモ帳等で開いてみたのですがいまいちよく解りませんでした。 分かる範囲ではググッたのですが・・・。 これを解決するにはどうしたらいいのでしょうか? 宜しく御願いします。

  • フリーソフトでcsvファイルの最後にeof(0x1a)を入力と確認をし

    フリーソフトでcsvファイルの最後にeof(0x1a)を入力と確認をしたいのですが 良い方法はありませんか? csvファイルの最後にeof(0x1a)を付けたいのですが http://okwave.jp/qa/q6068234.html で、コマンドプロンプトの方法を教えて頂いたのですが 変化はありませんでした。 目で(0x1a)が入力されているかを確認したいので フリーソフトを探しています。 ちなみにバイナリーエディタの「Stirling」を試してみましたが 「1a」が入力されていることは確認できますが 「0x1a」なのか確認できませんでした。

専門家に質問してみよう