こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c言語のfeof関数はどういう関数?

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

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

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

投稿日時 - 2009-05-14 06:50:24

QNo.4957311

困ってます

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

<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がセットされる
ということになります。

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

投稿日時 - 2009-05-14 11:22:08

お礼

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

投稿日時 - 2009-05-14 20:55:28

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

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

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

投稿日時 - 2009-05-14 13:30:35

お礼

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

投稿日時 - 2009-05-14 20:56:14

ANo.1

FILE構造体の仕様がコンパイラによってまったく違うので_IOEOFの意味を考えても意味がないです
調べられたコンパイラではFILE構造体のメンバ変数であるflagの下から5ビット目が終端指定子なのでしょう
ファイルの終端にきたら終端指定子がセットされるので
feofはストリームがファイルの終端かどうかを(終端指定子がセットされているかどうかで)調べる関数になります。

投稿日時 - 2009-05-14 08:32:57

お礼

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

投稿日時 - 2009-05-14 20:48:34

あなたにオススメの質問