プロが教えるわが家の防犯対策術!

feof関数について調べると、
・ストリームがファイルの終端かどうか調べる。
・終端指定子がセットされているかどうか調べる。
と、サイトによって説明のしかたが2つに分かれていました。
不思議に思ってstdio.hを調べてみると、

 #define _IOEOF 0x0010
 #define feof(_stream) ((_stream)->_flag & _IOEOF)

こんな感じになっていました。
上だとエラー指示子と0x0010(10進数で16)の論理積を出しているようですが、0x0010が何を意味するのかがわからないのでなにがなんだかです。
feofはどういう関数なのでしょうか?
回答よろしくお願いします。

A 回答 (3件)

<stdio.h>の実装については#1さんの通りです。



feofはthe end-of-file indicatorがセットされているかどうかを調べる関数です。
# 規格 (ISO/IEC 9899:1999) 7.19.10.2 The feof function

まず,規格7.19.3 Filesの11段落に,
> The byte input functions read characters from the stream as if by successive calls to the fgetc function.
とありますので,<wchar.h>で定義されるワイド入出力関数を除くと,ファイルの読み込みはすべてfgetcを使った読み込みを経由していると見なせます。
次に規格7.19.7.1 The fgetc functionの第3段落には
> If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-of-file indicator for the stream is set and the fgetc function returns EOF.
とあります。つまり,
・ストリームが終端に達した後,さらに読み込もうとするとthe end-of-file indicatorがセットされる
ということになります。

なので,
> ・ストリームがファイルの終端かどうか調べる。
ではなく,
> ・終端指定子がセットされているかどうか調べる。
が正しいことになります。
前者は曖昧と言えば曖昧ですが,終端に達した後「さらに読み込もうとした」ことが必要なので。
    • good
    • 0
この回答へのお礼

わかりました!
回答ありがとうございました。

お礼日時:2009/05/14 20:55

feof関数は、「ファイル終了表示子」がセットされているかどうかを判定します。



fgetcやfread等のストリーム入力関数によって値を読み込んだ結果、ファイルの終端に達しても、その時点ではファイル終了表示子はセットされません。その状態でさらに読み込もうとした時点でファイル終了表示がセットされます。

また、いったんファイル終了表示子がセットされたとしても、clearerrの呼び出し等によって、ファイル位置表示子がファイルの終端にあるままの状態でファイル終端表示子はクリアされ、feofが0を返すようになります。
    • good
    • 0
この回答へのお礼

回答ありがとうございました!

お礼日時:2009/05/14 20:56

FILE構造体の仕様がコンパイラによってまったく違うので_IOEOFの意味を考えても意味がないです


調べられたコンパイラではFILE構造体のメンバ変数であるflagの下から5ビット目が終端指定子なのでしょう
ファイルの終端にきたら終端指定子がセットされるので
feofはストリームがファイルの終端かどうかを(終端指定子がセットされているかどうかで)調べる関数になります。
    • good
    • 2
この回答へのお礼

回答ありがとうございました!

お礼日時:2009/05/14 20:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!