解決済み

C言語 ファイル処理を教えてください!

  • すぐに回答を!
  • 質問No.4172946
  • 閲覧数127
  • ありがとう数2
  • 気になる数0
  • 回答数4
  • コメント数0

089067
054086
090100
 ・
 ・
というように、あるテストでの英語と数学の点数が
上記のように入っているファイルを読み込み、
・ファイル内のデータと入力した数値が一致すれば出力
・ファイル内のデータと入力した数値と一致しなければ、【全てのデータを読み込んだ後にエラー文を1行出力】
というプログラムを作りたいのですが、
後者のエラー出力を設定がわかりません。
本を見たりサイトを調べたり、自分なりに色々してみたのですが、
どうしてもわからないので教えてください。

今作っているのが↓のプログラムですが、
やっぱり原因はwhileの設定かelseなんでしょうか・・・

while (fscanf(fp, "%3d%3d", &e_data, &m_data) == 2) {

if ((e_data == n1) && (m_data == n2)) {
printf("英語%03d 数学%03d\n", n1, n2);
break;
}

else {
printf("入力した点数の人はいません\n");
return(0);
}
}

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

  • 回答No.1

ベストアンサー率 52% (391/751)

>後者のエラー出力を設定がわかりません。
これは、「後者のエラー出力を行う方法がわかりません。」の意味として回答しますね。
まず、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);
}

しかしこれではエラー文が出力されませんでした・・・
まだどこか間違ってるのでしょうか・・・
投稿日時 - 2008-07-13 12:58:43
Be MORE 7・12 OK-チップでイイコトはじまる

その他の回答 (全3件)

  • 回答No.4

ベストアンサー率 52% (391/751)

#です。
こちらで、提示されたソースで、実行しました。
以下実行結果です。
データのファイル名: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

確認したところ実行でき、出力もちゃんと出来ました!
どうやらコンパイラの調子が悪かったみたいです・・・

親切、丁寧にありがとうございました!
すごく助かりました!
本当にありがとうございました!
投稿日時 - 2008-07-13 16:22:07
  • 回答No.3

ベストアンサー率 52% (391/751)

#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);
}
投稿日時 - 2008-07-13 14:10:01
  • 回答No.2

ベストアンサー率 71% (1325/1856)

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

フラグを立てるということがわからないので
調べてみます。
ありがとうございました。
投稿日時 - 2008-07-13 13:22:16
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
このQ&Aのテーマ

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ