ファイルがファイルの最後に読み込まれたかどうかを判断する方法

5779 ワード

バイナリファイル:
ヘッダファイル:#include
#define  feof(_stream)  ((_stream)->_flag & _IOEOF)

feof()関数は、現在のファイルストリーム上のファイル終了フラグを検出し、ファイル終了が読み込まれたかどうかを判断するために使用され、その原型はint feof(FILE*stream);
【パラメータ】streamはファイルフローポインタです.
【戻り値】ファイル終了フラグが1を返すことを検出し、そうでなければ0を返す.
ファイル終了フラグは通常、前回の読み書き操作で設定されますが、もちろん手動で設定することもできます.
ファイル内部の位置ポインタがファイルの終了を指す場合、FILE構造のファイル終了フラグはすぐに設定されず、ファイルの読み取り操作をもう一度実行するだけで終了フラグが設定され、その後feof()が呼び出されて真に戻ります.
ファイル終了識別はclearerr()、rewind()、fseek()、fsetpos()、freopen()関数によってクリアできます.このとき位置ポインタがリセットされていない場合は、次回のI/O操作時に設定します.
なお、feof()はEOFとは異なり、feof()はファイルの終了を検出するための関数である.
テキストファイル:
EOFはEnd Of Fileの略で、C言語の標準ライブラリで定義されたマクロで、#define EOF(-1)と定義されています.
EOFの値は-1でintタイプのデータであり、32ビットシステムでは0 xFFFFFFFFFFと表すことができる.EOFは文字ではなく、ファイルに実際に存在する内容でもありません.EOFは、ファイルの読み取りが終了した状態を表すだけでなく、I/O操作における読み取り、書き込みエラー(ferror()で検出可能)やその他の関連操作のエラー状態を表すこともできます.
fgetc()やgetc()などの関数がEOFを返すのは必ずしもファイルの終了を示すものではなく、ファイルの読み取りエラーが発生した場合もEOFを返し、-1を返すだけでファイルの終了がエラーであると判断する.そのため、ファイルが終了したか否かをfeof()で判断する必要があり、もちろんfeof()でファイルが終了した場合にも読み出し操作にエラーが発生したか否かを判断する必要があり、この場合ferror()で判断し、それが真である場合にエラー発生を示すことができる.実際のプログラムでは、ファイル操作を実行するたびにferror()関数でエラーが発生したかどうかを検出する必要があります.
たとえば、ファイルポインタfpがあり、ファイルには「hello world」という文字列があります.
int c=0;
while( !feof(fp) )
{
    int c=fgetc(fp);
    printf("%c: %x 
"
, c, c); }

上記のコードは、helloの出力に加えて、終了文字EOF(EOFはfgetc関数の戻り値であり、ファイルにEOFが存在するわけではない)も出力されます.内部位置ポインタが末尾を指す場合、読み取り操作を1回実行しなければ、ファイル終了フラグが設定されないためです.
上のコードを変更します.
int c; 
c=fgetc(fp);     
while( !feof(fp) ) 
{    
    printf("%c: %x 
"
, c, c); c=fgetc(fp); }

上のコードは「hello」のみを出力し、ファイル終端子EOFは出力しません.ファイル内部の位置ポインタが終了位置を指す場合は、まず1回の読み取り操作を実行し、ファイル終了フラグを設定し、whileループはすぐに終了します.
【例】終了するまでファイルを読み込み、先頭に戻って再読み込みします.
#include
#include
void main(void)
{
    FILE* stream;
    long l;
    float fp;
    char s[81];
    char c;
    stream = fopen("fscanf.txt","w+");
    if(stream == NULL)  /*      */
    {
        printf("the file is opeaned error!
"
); } else { fprintf(stream,"%s %ld %f %c","a_string",6500,3.1415,'x'); fseek(stream,0L,SEEK_SET); /* */ fscanf(stream,"%s",s); printf("%ld
"
,ftell(stream)); fscanf(stream,"%ld",&l); printf("%ld
"
,ftell(stream)); fscanf(stream,"%f",&fp); printf("%ld
"
,ftell(stream)); fscanf(stream," %c",&c); printf("%ld
"
,ftell(stream)); fgetc(stream); /* */ if(!ferror(stream)) { if(feof(stream)) /* */ { printf("We have reached end-of-file
"
); rewind(stream); fscanf(stream,"%s",s); printf("%s
"
,s); } } fclose(stream); } }

実行結果:
8
13
22
24
We have reached end-of-file
a_string

プログラムはまず1つのファイルを作成し、4つのタイプのデータを書き込み、それから読み取り/書き込みポインタをファイルの先頭に位置して現在のポインタを1つずつ読み出して出力し、ファイルの末尾に着いたらファイルの末尾に着いたことを提示し、ファイルを先頭に再配置し、文字列を読み出す.