アプリ版:「スタンプのみでお礼する」機能のリリースについて

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);
}
}


以上です。

このような場合どうしたらよいのでしょうか?また異なるやり方があればご教授お願いします。
よろしくお願いします。

A 回答 (2件)

ferror関数でエラーが発生しているかどうかが判定できます。


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

参考URL:http://ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken …
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/01/29 11:20

エラーの種類を調べるためには、


<errno.h>の中で宣言されている変数errnoが使えます。
Cの処理系およびライブラリ関数は、
直前に起きたエラーの種類を、int型の整数値として、
errnoにセットします。
これをチェックすれば、可能だと思います。

ただし、どのエラーがどの番号になるかは処理系依存です。
エラーの種類を見分けるには、処理系のヘルプを参照する必要があります。
(<string.h>の中にあるstrerr()は、エラーナンバーを
説明する文に変換してくれるので、参考になるかもしれません。)

以下、個人的な話…。
私がやるとしたら、入力エラーと、ファイルの最後は区別しません。
入力エラーが発生したら、そこでファイルが終わったものとみなします。
途中まで読めていたファイルが読めなくなった、ということは、
エラーの中でもかなり頻度が低いと思われるので、
そこまで面倒見ていられないからです。
(ただしこれは一般的なプログラムの話です。
ディスクユーティリティなどの場合は別です)
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/01/29 11:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!