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

標準関数
構文
応用

管理人

プライバシーポリシー


書式

#include <stdio.h>

int feof( FILE *fp );

■戻り値:
ファイルポインタfpがファイルの終端(EOF)に達していない場合は0、
ファイルの終端(EOF)に達している場合は0以外を返す。

説明

fopenなどでファイルをオープンし、その戻り値であるファイルポインタfpが取得済でなければならない。
但し、標準入力stdinからの入力であればオープンする必要はない。

fgetsなどでファイルを読み込む関数では、EOFで読み込み終了と判定することが一般的であるが、読み込みエラーであってもEOFを返すので正確な判定が出来ない。
そのような場合に本関数feofを使用してEOF判定を行えば良い。

ファイル(改行コードを可視化しています)
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です。
しかし、互換性維持のためにfgetcで取得すると0x0aになります。

0123456789\n
[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 = feof( fp );
  printf( "ret(before fgetc)=%d\n" , ret );

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

  /* 上のwhile文でEOFが本当のEOFによるものか否かを判定 */
  ret = feof( 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;  
}

実行結果
Windows環境の場合、ret(after fgetc)=16と表示され(る場合があり)ます。

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)=1

補足

参考までにファイルポインタfpに標準出力stdinを指定したサンプルを以下に示す。

以下のサンプルを実行して、キーボード(標準入力)から任意の文字(列)を入力して動作確認が出来る。

尚、プログラムを終了する場合、linux環境ではCtrl-d、windows環境ではctrl-zを入力する。

サンプル(補足)

#include <stdio.h>

main() {

  int ret , get_ch;

  ret = feof( stdin );
  if( ret == 0 ) {
    printf( "標準入力はEOFではありません。\n" );
  }

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

  ret = feof( stdin );
  if( ret != 0 ) {
    printf( "標準入力はEOFです。\n" );
  }
}

実行結果(補足)
実行時に入力した文字列は"abc"です。終了するには、linux環境ではCtrl-d、windows環境ではctrl-zです。

標準入力はEOFではありません。
abc
get_ch=0x61
get_ch=0x62
get_ch=0x63
get_ch=0x0a
標準入力はEOFです。


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