• ベストアンサー

txtファイルを読み込んで表示関数を用いて表示する方法

5名の会社員の健康管理表を作成するプログラムで、データとして「名前(英大文字最大10字)」「年齢」「身長」「体重」「最低血圧」「最高血圧」があらかじめ与えられています。 これをテキストファイルdata.txtに納めておき、プログラムには15人分のデータが入る構造体の配列を用意し、fscanf()関数で読み込んでから、「標準体重」と「高血圧診断結果」を計算した上で、一覧データを画面に表示したいんですが、コンパイルができたもののエラーが出て動きません。どこがまずいんでしょうか? data.txtの中身 AKIYAMA 35 179.1 72.5 97 145 ENDOU 40 162.5 65.3 85 130 HONNMA 42 171.8 68.9 89 166 SATO 45 167.2 64.1 91 142 YAMADA 50 168.4 59.5 85 151 プログラム #include <stdio.h> /*標準入出力関数の使用宣言*/ #include <string.h> struct kenkou{ /*健康管理表データの構造体テンプレート作成*/     char *name; /*名前用ポインタ変数*/     int age; /*年齢用データ変数*/     double sintyou; /*身長用データ変数*/ double weight; /*体重用データ変数*/     double hweight; /*標準体重用データ変数*/     double lblood; /*最低血圧用データ変数*/ double hblood; /*最高血圧用データ変数*/     char bloodj[30]; /*血圧診断用データ変数*/ }; void display(struct kenkou *pa) {  printf(" 名前 年齢 身長 体重 標準体重 最低血圧 最高血圧 血圧診断\n");    while(pa->name != NULL) { printf("%20s %3d %3.1f %3.1f %3.1f %3d %3d %10s\n", pa->name,pa->age,pa->sintyou,pa->weight, pa->hweight,pa>lblood,pa->hblood,pa->bloodj); pa++; } } int main(void) /*main関数*/ { FILE *fp; int i; struct kenkou data[15]; fp = fopen( "data.txt", "r" ); if( fp == NULL ) { puts( "data.txtが開けません" ); return 1; } for(i=0; i<15 && !feof(fp); i++){ fscanf(fp,"%20s %3d %3.1f %3.1f %3d %3d",data[i].name, &data[i].age,&data[i].sintyou,&data[i].weight, &data[i].lblood,&data[i].hblood); data[i].hweight=(data[i].sintyou-100)*0.9; if(data[i].lblood<=90&&data[i].hblood<=140){ strcpy(data[i].bloodj,"正常血圧");} else if(data[i].lblood>=95&&data[i].hblood>=160){ strcpy(data[i].bloodj,"高血圧");} else{ strcpy(data[i].bloodj,"境界域高血圧");} i++; } fclose(fp); display(data); return 0; }

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

正しく動くように手を加えてみました。 #include <stdio.h> #include <string.h> typedef struct _kenkou {   char name[11];   int age;   double sintyou;   double weight;   double hweight;   int lblood;   int hblood;   char bloodj[30]; } kenkou; void display(kenkou *pa, int count) {   int i;      printf("名前 年齢 身 長 体重 標準体重 最低血圧 最高血圧 血圧診断\n");   for (i = 0; i < count; i++) {     printf("%-10s %4d %3.1f %3.1f %3.1f %3d %3d %s\n",     pa->name, pa->age, pa->sintyou, pa->weight,     pa->hweight, pa->lblood, pa->hblood, pa->bloodj);     pa++;   } } int main(void) {   FILE *fp;   int i;   kenkou data[15];      fp = fopen("data.txt", "r");   if (fp == NULL) {     puts("data.txtが開けません");     return 1;   }      for (i = 0; i < 15 && !feof(fp); i++) {     fscanf(fp, "%s%d%lf%lf%d%d",       data[i].name, &data[i].age, &data[i].sintyou, &data[i].weight,       &data[i].lblood, &data[i].hblood);       data[i].hweight = (data[i].sintyou - 100) * 0.9;     if (data[i].lblood <= 90 && data[i].hblood <= 140) {       strcpy(data[i].bloodj, "正常血圧");     }     else if (data[i].lblood >= 95 && data[i].hblood >= 160) {       strcpy(data[i].bloodj, "高血圧");     }     else {       strcpy(data[i].bloodj, "境界域高血圧");     }   }   fclose(fp);   display(data, i);   return 0; } (注)インデントのため、全角空白を使っています。

morityun
質問者

お礼

具体的にプログラムを提示してくださってありがとうございます。 プログラムのとおり作ってみましたが名前・・・が表示された後エラーがでました。 printf("%10s%3d%3.1f%3.1f%3.1f%3d%3d%s\n",pa->name,pa->age,pa->sintyou,pa->weight,pa->hweight,pa->lblood,pa->hblood,pa->bloodj); ここの部分でエラーがでてしまうようです。 display関数の int i;の後ろにprintfでcountを表示させてみると、data.txtの中には5人分のデータしかないにもかかわらず6となったため、main関数内の最後のdiplay関数の呼び出しをdisplay(data,i-1)にしました。

morityun
質問者

補足

すいません,もう一度見直してみるとasuncionさんのものをdata-1になおせば完成しました。お手数おかけしました、ありがとうございます。

その他の回答 (2)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

>char *name; /*名前用ポインタ変数*/ >fscanf(fp,"%20s %3d %3.1f %3.1f %3d %3d",data[i].name, そもそも、nameの領域がありませんね。

  • tekebon
  • ベストアンサー率62% (36/58)
回答No.1

とりあえず気づいた点としては、fscanf関数に%3.1fなどの精度は指定できません。 また、フィールド幅は固定長レコードファイルのときに使用するものなので、今回は 可変長レコードファイルですから%sとか%fだけで幅は指定しなくてもいけるはずです。 また、double型の場合は%lfになりますのでその辺を確認してみてはいかがでしょうか? また、どのへんまで実行した時にどんなエラーが出たのか等、もう少し詳しい情報があれば 原因も考えやすくなります。

morityun
質問者

お礼

回答していただき、ありがとうございます。 fscanf関数を fscanf(fp,"%s %d %lf %lf %d %d",data[i].name,&data[i].age,&data[i].sintyou,&data[i].weight,&data[i].lblood,&data[i].hblood); に変更してコンパイルし実行すると、何も表示されず 問題が発生したため、kenkou.exe を終了します。 ご不便をおかけして申し訳ありません。 が表示されて終了してしまいます。

関連するQ&A