• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 ファイル処理を教えてください!)

C言語 ファイル処理でのエラー出力方法

このQ&Aのポイント
  • C言語のファイル処理において、あるテストでの英語と数学の点数が入ったファイルを読み込み、入力した数値と一致するデータがあれば出力するプログラムを作成しています。
  • しかし、一致するデータがない場合にエラー文を出力する方法がわかりません。
  • whileループとelse文の設定に何か問題があるのでしょうか。助けてください。

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

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

>後者のエラー出力を設定がわかりません。 これは、「後者のエラー出力を行う方法がわかりません。」の意味として回答しますね。 まず、int 型の変数を1つ用意します。 int ari;とします。 最初にwhileの前で ari = 0; とします。これは、「ファイル内のデータと入力した数値と一致するものがない」ことを示します。 次に、whileで一致したとき、 printf("英語%03d 数学%03d\n", n1, n2); break; の間に、 ari = 1; を入れます。 printf("英語%03d 数学%03d\n", n1, n2); ari = 1; break; になりますね。 while文の処理を抜けた後で、 このariが0なら、入力した点数の人はいなかったことになります。 このような、ariの変数をプログラミングの世界ではフラグ(日本語で旗に相当)といいます。

noname#62850
質問者

補足

フラグというものの知識が皆無なので、 ちゃんと理解出来ていませんが 以下のとおりにしてみました。 int ari; と宣言しておいて、 ari = 0; while (fscanf(fp, "%3d%3d", &e_data, &m_data) == 2) { if ((e_data == n1) && (m_data == n2)) { printf("英語%03d 数学%03d\n", n1, n2); ari = 1; break; } } if (ari == 0) { printf("入力した点数の人はいません\n"); return(0); } しかしこれではエラー文が出力されませんでした・・・ まだどこか間違ってるのでしょうか・・・

その他の回答 (3)

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

#です。 こちらで、提示されたソースで、実行しました。 以下実行結果です。 データのファイル名:data.txt その内容 089067 054086 090100 プログラム名:goo12.exe 以下、実行結果 D:\goo>goo12 ファイル名を入力してください:data.txt 点数を入力してください。 英語:54 数学:86 英語054 数学086 D:\goo>goo12 ファイル名を入力してください:data.txt 点数を入力してください。 英語:12 数学:13 英語012 数学013の人はいません 正常にこちらでは、正常に動作しています。 以下の環境で試験しました。 OS:Windows2000 コンパイラ:Borland C++ 5.5.1 for Win32 これから、でかけますので、この次は、8時頃になります。

noname#62850
質問者

お礼

確認したところ実行でき、出力もちゃんと出来ました! どうやらコンパイラの調子が悪かったみたいです・・・ 親切、丁寧にありがとうございました! すごく助かりました! 本当にありがとうございました!

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

#1です。 >しかしこれではエラー文が出力されませんでした・・・ >まだどこか間違ってるのでしょうか・・・ これは、「入力した点数の人はいません」が表示されなかったという意味ですね。 ソースを見る限りは、正しいです。 当然の話ですが、「printf("英語%03d 数学%03d\n", n1, n2);」 のところは、実行されないで(表示されないで)、なおかつ、 「入力した点数の人はいません」も表示されなかったということですね。 もし、そうだとすると、ソース全体を見る必要があります。 ここに提示されている範囲内では、正しいです。従って、他に問題が 有るかも知れませんので、ソース全体を提示して下さい。 また、ソースの転記で間違い可能性もありますので、 ソースをコピー&ペーストして下さい。

noname#62850
質問者

補足

当然の話ですが、「printf("英語%03d 数学%03d\n", n1, n2);」 のところは、実行されないで(表示されないで)、なおかつ、 「入力した点数の人はいません」も表示されなかったということですね。 ↑その通りです。 説明不十分ですみません・・・。 これが全体のソースです。 お願いします。 #include <stdio.h> int main(void) { FILE *fp; int n1, n2; int e_data, m_data; char fname[30]; int f_data; printf("ファイル名を入力してください:"); gets(fname); if ((fp = fopen(fname, "r")) == NULL) { printf("ファイルが見つかりません。\n"); return(0); } else { printf("点数を入力してください。\n"); printf("英語:"); scanf("%d", &n1); printf("数学:"); scanf("%d", &n2); f_data = 0; while (fscanf(fp, "%3d%3d", &e_data, &m_data) == 2) { if ((e_data == n1) && (m_data == n2)) { printf("英語%03d 数学%03d\n", n1, n2); f_data = 1; break; } } } if (f_data == 0) { printf("英語%03d 数学%03dの人はいません\n", n1, n2); } fclose(fp); return(0); }

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

whileループに入る前にフラグをリセット 一致した場合はフラグを立てて whileループを抜ける whileループを抜けた際にフラグが立っていなければエラー出力 といった具合にしましょう

noname#62850
質問者

お礼

フラグを立てるということがわからないので 調べてみます。 ありがとうございました。

関連するQ&A

専門家に質問してみよう