C言語 標準関数 | 応用 | サンプル

標準関数
構文
応用

管理人

プライバシーポリシー


書式

#include <stdio.h>

int ferror( FILE *fp );

■戻り値:
ファイルの読み書き関数でエラーが発生していた場合は0以外、正常(エラーで無い)な場合は0を返す。

説明

fopenなどでファイルをオープンし、その戻り値であるファイルポインタfpが取得済でなければならない。

fgetsなどのファイルを読み込み関数では、EOFで読み込み終了と判定することが一般的であるが、読み込みエラーであってもEOFを返すので正確な判定が出来ない。

そのような場合には、本関数ferrorでエラー判定を行うことができる。また、ファイル書き込みエラーも同様に判定できる。

ファイル
(Linuxのviでは0123456789と入力後にEnterKeyを打鍵しないこと。
viだとEnterKeyを打鍵しなくとも改行コード(\n)が入るようです。
"ls -l test.txt"でファイルサイズが11バイト(\n=0x0a)であることを確認して下さい。
尚、Windowsではメモ帳(NotePad)で作成しEnterKeyを打鍵すること。
EnterKeyを打鍵しないと改行コードは入らないようです。
ファイルを右クリックして(プロパティで)ファイルサイズが
12バイト(\n=0x0d0a)であることを確認して下さい。
また、12バイトにはEOFコードは含まれておりません。
余談ですが、Windowsでは\nは0x0d0aです。
しかし、互換性維持のためにgetcで取得すると0x0aになります。)

0123456789
[EOF]

サンプル

#include <stdio.h>

main() {

  FILE * fp;
  int ret;
  int get_ch;

  /* Windows系の場合は"test.txt" */
  fp = fopen( "./test.txt" , "r" );
  if( fp == NULL ) {
    printf( "ファイルオープンエラー。\n" );
    return -1;
  }

  ret = ferror( fp );
  printf( "ret(before fgetc)=%d\n" , ret );

  while(( get_ch = fgetc( fp )) != EOF ) {
    printf( "get_ch=0x%02x\n" , get_ch );
  }

  /* 上のwhile文でEOFがエラー発生によるものか否かを判定 */
  ret = ferror( fp );
  if( ret == 0 ) {
    printf( "ファイル読み込みはEOFです。\n" );
  }
  printf( "ret(after fgetc)=%d\n" , ret );

  ret = fclose( fp );
  if( ret == EOF ) {
    printf( "ファイルクローズに失敗しました。\n" );
    return -1;
  }

  return 0;  
}

実行結果

ret(before fgetc)=0
get_ch=0x30
get_ch=0x31
get_ch=0x32
get_ch=0x33
get_ch=0x34
get_ch=0x35
get_ch=0x36
get_ch=0x37
get_ch=0x38
get_ch=0x39
get_ch=0x0a
ファイル読み込みはEOFです。
ret(after fgetc)=0


Copyright © 2008-2015 http://hitorilife.com All Rights Reserved.