###前提・実現したいこと
テキストファイルから情報を取り込みたい。
中身は
Dbrenlhsij,11,162.2,55.9
Ijnpwthy,14,163.8,62.6
Csaztvsy,30,176.2,57.1
Pgqfcwlx,22,161.2,57.3
Mgjwpmdxr,19,162.,65.2
Jryebcpduv,54,167.2,55.2
Dqesqocy,22,169.,64.9
というように続いていきます。(10000行あります)
fgetsを使ってstrtokでも同じことができると思いますが、学習のためにfscanfを使った方法が知りたいです。またなぜこれでは値がとりこめないのかを教えていただきたいです。
###発生している問題・エラーメッセージ
fscanf(46行目)が値をとりこまない。
結果としてprintfで出力する変数は全て0.0になっています。
###該当のソースコード
c
1 2#include <stdio.h> 3#include <math.h> 4#include <stdlib.h> 5 6#define SIZE 100 7 8void cal(double*,double*,double*,double*,double*,int); 9 10int main(int argc,char *argv[]){ 11 FILE *fp; 12 int line=0; 13 char c; 14 15 if(argc!=2) { 16 printf("コマンドの後に1つファイルを指定してください。\n"); 17 return 1; 18 } 19 20 if ((fp= fopen(argv[1], "r"))==NULL) { 21 printf("ファイルを開くのに失敗しました\n"); 22 return 1; 23 } 24 25 while((c = getc(fp)) != EOF) { 26 if(c == '\n') { 27 line++; 28 } 29 } 30 31 fseek(fp,0,SEEK_SET); 32 33 double *a; 34 double *h; 35 double *w; 36 double *max,*min,*mean,*stdev; 37 38 max=(double*)malloc(sizeof(double)); 39 min=(double*)malloc(sizeof(double)); 40 mean=(double*)malloc(sizeof(double)); 41 stdev=(double*)malloc(sizeof(double)); 42 a=(double*)malloc(sizeof(double)*line); 43 h=(double*)malloc(sizeof(double)*line); 44 w=(double*)malloc(sizeof(double)*line); 45 46 for (int i=0; i<line; i++) { 47 fscanf(fp,"%*[^,]%lf,%lf,%lf\n",a+i,h+i,w+i); 48 } 49 50 cal(a,max,min,mean,stdev,line); 51 printf("Age : (max,min,mean,stdev) = (%lf, %lf, %lf, %lf)\n", 52 *max,*min,*mean,*stdev); 53 54 cal(h,max,min,mean,stdev,line); 55 printf("Age : (max,min,mean,stdev) = (%lf, %lf, %lf, %lf)\n", 56 *max,*min,*mean,*stdev); 57 58 cal(w,max,min,mean,stdev,line); 59 printf("Age : (max,min,mean,stdev) = (%lf, %lf, %lf, %lf)\n", 60 *max,*min,*mean,*stdev); 61 62 free(max); 63 free(min); 64 free(mean); 65 free(stdev); 66 free(a); 67 free(h); 68 free(w); 69 70 fclose(fp); 71 72 return 0; 73} 74 75void cal(double *x,double *max,double *min,double *mean,double *stdev,int line){ 76 *max=0,*min=1000,*mean=0,*stdev=0; 77 78 for (int i=0; i<line; i++) { 79 if ( *(x+i) > *max) { 80 *max = *(x+i); 81 } 82 if ( *(x+i) < *min) { 83 *min = *(x+i); 84 } 85 *mean= *mean + *(x+i); 86 } 87 *mean = *mean/line; 88 for (int i=0; i<line; i++) { 89 *stdev= *stdev + pow(*(x+i)-*mean,2); 90 } 91 *stdev= sqrt( *stdev/(double)line ); 92} 93
###試したこと
fscanfの返り値を調べたところ毎回0でした。デバッガを用いて動きを追ってみたのですがやはりfscanfが問題のようです。
###補足情報(言語/FW/ツール等のバージョンなど)
OS Xです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。