• ベストアンサー

ファイルのデータがうまく読み込まれません

こんにちは。ファイルからデータを読み込んで、平均値と標準偏差を求めるプログラムを書いているんですが、計算結果がなぜか違う値になってしまいます。書いているプログラムは、 #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の部分が違うんでしょうか?初心者でどこが違うのか分かりません。教えていただけないでしょうか?

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

  • ベストアンサー
  • S2GBK
  • ベストアンサー率100% (1/1)
回答No.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); }

noname#1619
質問者

お礼

S2GBKさんありがとうございます。その後色々やってみたのですが、やはりダメでした。けどこれからもC言語がんばろうと思います。またお世話になるかもしれませんがよろしくお願いしますね!

その他の回答 (2)

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

ロジックは良く読んでませんが >if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ; %f で値を代入させたい a[i] はアドレスを渡さないとだめですよ。 &a[i] です。

noname#1619
質問者

お礼

教えてくださってありがとうございます。初歩的なミスですね。これからもC言語がんばります。

回答No.1

>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]); とか、ループして出力するとか…

noname#1619
質問者

お礼

教えてくださったように途中で値を出してみたところぜんぜん違う値が入力されていることが分かりました。はじめ break を書いていたのですがそれもどうもうまくいかなくて・・・。これから色々やってみようと思います。ありがとうございました。

関連するQ&A