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);
}
}
以上です。
このような場合どうしたらよいのでしょうか?また異なるやり方があればご教授お願いします。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
ferror関数でエラーが発生しているかどうかが判定できます。
feof関数でファイル終端かどうかが判定出来ます。
詳しくは、参考URLを見てください。
参考URL:http://ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken …
No.1
- 回答日時:
エラーの種類を調べるためには、
<errno.h>の中で宣言されている変数errnoが使えます。
Cの処理系およびライブラリ関数は、
直前に起きたエラーの種類を、int型の整数値として、
errnoにセットします。
これをチェックすれば、可能だと思います。
ただし、どのエラーがどの番号になるかは処理系依存です。
エラーの種類を見分けるには、処理系のヘルプを参照する必要があります。
(<string.h>の中にあるstrerr()は、エラーナンバーを
説明する文に変換してくれるので、参考になるかもしれません。)
以下、個人的な話…。
私がやるとしたら、入力エラーと、ファイルの最後は区別しません。
入力エラーが発生したら、そこでファイルが終わったものとみなします。
途中まで読めていたファイルが読めなくなった、ということは、
エラーの中でもかなり頻度が低いと思われるので、
そこまで面倒見ていられないからです。
(ただしこれは一般的なプログラムの話です。
ディスクユーティリティなどの場合は別です)
ありがとうございます。
個人的な話・・・、以下の内容がすごくためになります。
頻度というものも考えて作られているのですね。参考になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「パス名が無効です」の発生原因
-
batファイルでレジストリキーの...
-
VBでファイルが開かれているか...
-
FTPの送信結果を検知したい
-
エクセルマクロでエラーの原因...
-
Excel 2003 のエラーメッセージ
-
Returnに対するGoSubがありません
-
FORTRANの実行エラーについて
-
access テキストボックスの値取得
-
Excel VBAのApplication.Execut...
-
VBA ExecuteExcel4Macro 型が一...
-
gccを行ってもexeファイルが生...
-
PowerShellを使って関連付けら...
-
自身のファイルのコピーを作成...
-
エクセル「これ以上新しいフォ...
-
アクセスでイベントのロジック...
-
【COBOL】read文でエラー
-
freadでデータがない場合の読込...
-
NAS上のファイルの使用中が解除...
-
EXCELのVBAでの保存方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
gccを行ってもexeファイルが生...
-
VBでファイルが開かれているか...
-
「パス名が無効です」の発生原因
-
batファイルでレジストリキーの...
-
Returnに対するGoSubがありません
-
VBから参照できないCのDLLを使...
-
PowerShellを使って関連付けら...
-
アクセスのクエリでコンパイル...
-
VB6 Dir関数で52エラー発生
-
FTPの送信結果を検知したい
-
NAS上のファイルの使用中が解除...
-
VBA ExecuteExcel4Macro 型が一...
-
access テキストボックスの値取得
-
EXCELのVBAでWORDが開いてある...
-
すでにファイルが開かれている...
-
EXCELVBAでONEDRIVE上への保管...
-
Excelファイルのマクロによる排...
-
OUTLOOK VBA 指定フォルダ内の...
-
RAR圧縮ファイル(分割)の順番が...
-
エクセルマクロでエラーの原因...
おすすめ情報