- ベストアンサー
ファイルのデータがうまく読み込まれません
こんにちは。ファイルからデータを読み込んで、平均値と標準偏差を求めるプログラムを書いているんですが、計算結果がなぜか違う値になってしまいます。書いているプログラムは、 #include<stdio.h> #include<math.h> #define MAX 200 /* ファイル"sample.txt"から複数の値を入力し、それらの 平均値、標準偏差を出力する. */ void main(void) { FILE *fp; char text[256],l[256]; int i, n; float a[MAX], sum,sum2,mean,sdev; fp = fopen("sample.dat","r"); /* sample.txt を開く */ if(fp == NULL){ printf("Error!\n");exit(0);}/* sample.txtがなければ停止 */ for(i = 1; i <= 3; i++) fscanf(fp, "%s\n",text); for(i = 0; i < MAX; i++) { if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ; } n = i; sum = a[0]; sum2 = a[0]*a[0]; for(i = 0; i < n; i++) { sum += a [i]; sum2 += a[i]*a[i]; } mean = sum/n; /* 平均値の計算 */ sdev = sqrt(sum2/n - mean*mean); /* 標準偏差の計算 */ printf(" mean : %6.2f\n", mean); printf("standard dev.: %6.2f\n",sdev); } で、読み込むファイルは 平均値と標準偏差の計算 クラスA組み 氏名 身長(cm) 鈴木 175.54 佐藤 170.34 清水 165.29 徳田 185.23 赤木 178.61 と、長くなってしまいましたが、if文の中のfscanfの部分が違うんでしょうか?初心者でどこが違うのか分かりません。教えていただけないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
とりあえずloiloiさんの作ったプログラムを元に動くように変えたものです。 一応これからの参考になるように注釈もつけたつもりです。 これからの参考になれば幸いです(^^; #include<stdio.h> #include<math.h> #include<stdlib.h> #define MAX 200 /* ファイル"sample.txt"から複数の値を入力し、それらの 平均値、標準偏差を出力する. */ void main(void) { FILE *fp; char text[256]; int i, n;/*出来ればセミコロン(;)ごとに改行する方が見やすい*/ float a[MAX], sum,sum2,mean,sdev; fp = fopen("sample.txt","r"); /* sample.txt を開く */ if(fp == NULL) { printf("Error!\n"); exit(0); }/* sample.txtがなければ停止 */ for(i = 1; i <= 4; i++) /*3になってましたが3行目がスペースで区切られているので4に変更*/ fscanf(fp,"%s",text); for(i = 0; i < MAX; i++) { if(fscanf(fp,"%s",text)==EOF) break; fscanf(fp,"%f",&a[i]); } n = i; /*sum = a[0]; sum2 = a[0]*a[0]; */ for(i = 0; i < n; i++) { sum += a [i]; sum2 += a[i]*a[i];/*0からループは周り出すのでループ前の一文は必要ない*/ } mean = sum/n; /* 平均値の計算 */ sdev = sqrt(sum2/n - mean*mean); /* 標準偏差の計算 */ printf(" mean : %6.2f\n", mean); printf("standard dev.: %6.2f\n",sdev); }
その他の回答 (2)
- yatokesa
- ベストアンサー率40% (201/496)
ロジックは良く読んでませんが >if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ; %f で値を代入させたい a[i] はアドレスを渡さないとだめですよ。 &a[i] です。
お礼
教えてくださってありがとうございます。初歩的なミスですね。これからもC言語がんばります。
- SpiralGalaxy
- ベストアンサー率39% (649/1654)
>for(i = 0; i < MAX; i++) >{ >if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ; >} これだとEOFかどうか判定しているだけで、データがあろうが無かろうが必ず i=MAX までいってしまいますね。 break 忘れでは? >sum = a[0]; sum2 = a[0]*a[0]; 初期値に a[0] を使ったらまずいのでは? 結果的に a[0] を二回加算、乗算することになってます。 よく分からない場合は途中で値を出力してみればいいと思いますよ。 printf("a[0]=%6.2f\n", a[0]); printf("a[1]=%6.2f\n", a[1]); とか、ループして出力するとか…
お礼
教えてくださったように途中で値を出してみたところぜんぜん違う値が入力されていることが分かりました。はじめ break を書いていたのですがそれもどうもうまくいかなくて・・・。これから色々やってみようと思います。ありがとうございました。
お礼
S2GBKさんありがとうございます。その後色々やってみたのですが、やはりダメでした。けどこれからもC言語がんばろうと思います。またお世話になるかもしれませんがよろしくお願いしますね!