C言語 ファイルのエラー判定 終端判定 エラーのクリア - stdio.h - [ ferror, feof, clearerr ]
2008.09.30 Tuesday | by LRESULT
ファイルのエラー判定には、ferror()を使い、
エラーのクリアには、clearerr()を使用します。
また、ファイルの終端(EOF)判定には、feof()という関数が用意されています。
書式 | int ferror( FILE *fp ) |
---|---|
機能 | ファイルのエラー状態を判定する |
引数 | FILE *fp : ファイル(ストリーム)ポインタ |
戻り値 | エラーの場合は、0以外を返し、 正常な場合は、0を返します。 |
書式 | int feof( FILE *fp ) |
---|---|
機能 | ファイルの終端(EOF)判定を行う |
引数 | FILE *fp : ファイル(ストリーム)ポインタ |
戻り値 | 終端の場合は、0以外を返し、 終端で無い場合は、0を返します。 |
書式 | void clearerr( FILE *fp ) |
---|---|
機能 | エラー状態をクリアする |
引数 | FILE *fp : ファイル(ストリーム)ポインタ |
戻り値 | なし |
※ ferror()やfeof()が用意されているかというと、
fgetc()やfscanf()等ではエラーが起こった場合と、ファイル終端まで読み込んだ場合とで
同じEOF(-1)を戻り値として返してしまい区別が付かないため、
別々の関数として用意してあるわけです。
まず「test.txt」というファイルを読み込みモード "r" で開き、 fputs()でファイルの書き込みをしようとします。すると、エラーが発生するはずなので確認します。 更に、clearerr()でエラーをクリアし、エラーが無いか確認します。 |
---|
#include <stdio.h> int main(void) { FILE *fp; char *fname = "test.txt"; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%sファイルが開けません¥n", fname ); return -1; } fputs( "test", fp ); /* わざとエラーを発生させる */ if( ferror( fp ) != 0 ){ printf( "エラーが発生しました¥n" ); } clearerr( fp ); if( ferror( fp ) == 0 ){ printf( "エラーはクリアされました¥n" ); } fclose( fp ); return 0; } |
エラーが発生しました エラーはクリアされました |
---|
と、表示されます。 読み込みモードで開いたファイルに、書き込むとエラーが発生します。 そのままだと、エラーが発生したままなので、clearerr()でエラーを消去します。 |
※ 参考
C言語 エラー番号の取得 エラー内容の取得 - errno.h - [ errno, strerror ]
ファイルのエラー処理では、↑こちらも実用的だと思います。