feof() - ファイル終わり (EOF) 標識のテスト

標準

標準/拡張機能 C/C++ 依存項目

ISO C
POSIX.1
XPG4
XPG4.2
C99
Single UNIX Specification、バージョン 3
Language Environment

両方  

形式

#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
⁄* 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

関連情報