標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
ISO C |
両方 |
#include <stdio.h>
int feof(FILE *stream);
#define _OPEN_SYS_UNLOCKED_EXT 1
#include <stdio.h>
int feof_unlocked (FILE *stream);
stream で指定される与えられたストリームに対して、EOF フ ラグが設定されるかどうかを示します。
EOF フラグは、ユーザーが EOF を超えて読み取ろうとしたとき、設定されます。したがって、ファイルの最後の文字を読み取ってもフラグはオンにされません。次の読み取りで EOF に達します。
HFS ファイルでは、同時の読み取りで、自動的に拡張を行うことはできません。EOF フラグをリセットするには、clearerr() を使用する必要があります。
ファイルで、ファイルを拡張する同時の書き込みがある場合は、ファイルが拡張される前に、読み取りプログラムによってフラグがオンにされます。拡張が読み取りプログラムにとって可視になったあと、次の読み取りでは 新規データが取得され、フラグが正しく設定されます (fflush() を参照)。例えば、読み取りが EOF を超えて行われない場合は、フラグはオフにされます。ファイルで、ファイルを拡張している同時の書き込みがなければ、EOF を超えて 読み取ることはできません。
ファイル内での位置変更が正常に行われるか (fsetpos()、rewind()、fseek() によって) または clearerr() 呼び出しで、EOF フラグはリセットされます。端末ファイルでは、EOF フラグが設定されると、次の読み取りは、EOF フラグがクリアされるまで、なにもデータを送達しません。clearerr() または rewind() を呼び出すと、EOF フラグをクリアできます。
端末は、rewind() 関数または clearerr() 関数が呼び出された後で のみ EOF を超えた読み取りを行うことができます。このストリームに対して rewind()、fsetpos()、 fseek()、また は clearerr() を呼び出すことにより、EOF フラグをクリアできます。
feof_unlocked() は、スレッド・セーフでないことを除いて、機能的に feof() と 等価です。この関数をマルチスレッドのアプリケーション内で安全に使用できるのは、 flockfile() 関数または ftrylockfile() 関数のどちらかへの呼び出しが成功した後のように、 呼び出しスレッドが (FILE*) オブジェクトを所有している間に、この関数を呼び出す場合だけです。
stream に対して EOF フラグが設定された場合のみ、feof() は、ゼロ以外を戻します。
それ以外の場合は、feof() は 0 を戻します。
⁄* CELEBF09
This example scans the input stream until it reads an EOF character.
*⁄
#include <stdio.h>
#include <stdlib.h>
main() {
FILE *stream;
int rc;
stream = fopen("myfile.dat","r");
⁄* myfile.dat contains 3 characters "abc" *⁄
while (1) {
rc = fgetc(stream);
if (rc == EOF) {
if (feof(stream)) {
printf("at EOF¥n");
break;
}
else {
printf("error¥n");
break;
}
}
else
printf("read %c¥n",rc);
}
}
read a
read b
read c
at EOF