• ベストアンサー

fgetcの返却値 EOFについて

C言語について質問です。あまり詳しくないので言葉や、説明等間違っているところが あり読みにくいと思います。 fgetc関数の返却値についてのお伺いします。 EOFはファイルの終わり又は、読み込みが失敗すると、返却されるとあります。 ここで、質問なのですが、2つの違いを判断することは可能でしょうか? 私が行った作業は あるファイル内の文字を1文字づつ読み込んで。 文字の種類ごとに指定したbufferferに格納させたいと思っています。 しかし、ファイル内の終端がEOFで終る場合に読み込みエラーの場合と、読み込み終了で 場合分けができない為うまくできません。 #include <stdio.h> #include <ctype.h> char buffer[100]; char *filename="TestFile"; char* main(){ static FILE *fp = NULL; char *p = buffer; int c; if ( fp == NULL ){ if ((fp = fopen( filename, "r" )) == NULL ){ fprintf(stderr,"can not open file %s\n", filename); return ( (char *)NULL ); } } c = fgetc(fp); while(1){ switch(c){ case '\n': case '\0': *p = '\0'; return( buffer); /*以下のcase EOF の時に2通り考えられる*/ case EOF:/*読み込み終了*/ *p = '\0'; return( buffer); /* case EOF:/*読み込みエラー fprintf(stderr, " OPEN _ERROR %s\n", filename); fclose(fp); fp = NULL; return ( (char *)NULL ); */ default: *p = (char)c; p++; } c = fgetc(fp); } } 以上です。 このような場合どうしたらよいのでしょうか?また異なるやり方があればご教授お願いします。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

ferror関数でエラーが発生しているかどうかが判定できます。 feof関数でファイル終端かどうかが判定出来ます。 詳しくは、参考URLを見てください。

参考URL:
http://ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken/miyakosi/c07.html
2002hare
質問者

お礼

どうもありがとうございます。 お教えいただいてURLを参考にさせていただきました。

その他の回答 (1)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

エラーの種類を調べるためには、 <errno.h>の中で宣言されている変数errnoが使えます。 Cの処理系およびライブラリ関数は、 直前に起きたエラーの種類を、int型の整数値として、 errnoにセットします。 これをチェックすれば、可能だと思います。 ただし、どのエラーがどの番号になるかは処理系依存です。 エラーの種類を見分けるには、処理系のヘルプを参照する必要があります。 (<string.h>の中にあるstrerr()は、エラーナンバーを 説明する文に変換してくれるので、参考になるかもしれません。) 以下、個人的な話…。 私がやるとしたら、入力エラーと、ファイルの最後は区別しません。 入力エラーが発生したら、そこでファイルが終わったものとみなします。 途中まで読めていたファイルが読めなくなった、ということは、 エラーの中でもかなり頻度が低いと思われるので、 そこまで面倒見ていられないからです。 (ただしこれは一般的なプログラムの話です。 ディスクユーティリティなどの場合は別です)

2002hare
質問者

お礼

ありがとうございます。 個人的な話・・・、以下の内容がすごくためになります。 頻度というものも考えて作られているのですね。参考になります。

関連するQ&A