• ベストアンサー

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% (2126/6288)
回答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

  • C言語のプログラムで...

    下のプログラムは参考書にあったサンプルプログラムなのですが /* 関数の宣言 */ int print_struct(struct person dat); のところはなぜint型なのですか? #include <stdio.h> #include <string.h> /* 構造体の定義 */ struct person { char name[20]; /* 名前 */ double height; /* 身長 */ double weight; /* 体重 */ int bpl; /* 最低血圧 */ int bph; /* 最高血圧 */ }; /* 関数の宣言 */ int print_struct(struct person dat); /* main関数 */ int main(void) { /* 変数の宣言 */ struct person dat; /* 構造体のメンバーに値を代入 */ strcpy(dat.name,"山田太郎"); dat.height = 173.5; dat.weight = 63.0; dat.bpl = 98; dat.bph = 113; /* struct person関数を実行 */ print_struct(dat); return 0; } /* print_struct関数 */ int print_struct(struct person dat) { /* 画面に出力 */ printf("%s\n",dat.name); printf("%f\n",dat.height); printf("%f\n",dat.weight); printf("%d\n",dat.bpl); printf("%d\n",dat.bph); return 0; }

  • 複数ファイルの出力

    質問があります。1600個のデータを読み込んで(16個ずつの組で100組)、1番目、3番目、5番目、7番目のデータをss[1].txtとして出力し、同様に2番目、4番目、6番目、8番目のデータをsk[1].txt、9番目、11番目、13番目、15番目のデータをks[1].txt、10番目、12番目、14番目、16番目のデータをkk[1].txtとして出力させます。以下、ss[2].txt,sk[2].txt,ks[2].txt,kk[2].txt・・・に関してはそれぞれ直前のファイルに16を足したデータ(例えばss[2].txtなら、17番目、19番目、21番目、23番目のデータを出力)を出力させるというプログラムです。 以下に自分で作ったプログラムを掲載します。 void ecg_rr(fp,data_max) FILE *fp; { int i,j=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i,j=0;i<100,j<100;i++,j++) { sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0+j*16]); fprintf(fp,"%8.8f\n",data[0][2+j*16]); fprintf(fp,"%8.8f\n",data[0][4+j*16]); fprintf(fp,"%8.8f\n",data[0][6+j*16]); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1+j*16]); fprintf(fp,"%8.8f\n",data[0][3+j*16]); fprintf(fp,"%8.8f\n",data[0][5+j*16]); fprintf(fp,"%8.8f\n",data[0][9+j*16]); fclose(fp); /*ks,kkに関しても同様*/ } } これだと100個ずつファイルを出力できるのですが、データが全て0として出力されてしまいます。

  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • fpus:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • ファイルの入出力

    学生です。まだ習い始めて間もないのですがよろしくお願いします。 27.000000,207.000000,116.000000 48.000000,90.000000,116.000000 48.000000,90.000000,116.000000       : テキストの中にある上記のカンマ区切りのデータをfscanfで読み込んで違うテキストに同じ数値を出力したいのですがうまく出力できません。 0.000000,0.000000,+NAN 0.000000,0.000000,+NAN 0.000000,0.000000,+NAN      : 数値は上記のように出力されてしまいます。 プログラムは以下の通りです。 main() { FILE *fp; double m[30][3]; int i,j; double e1,e2,e3; fp=fopen("data00.txt","r"); for(i=0;i<30;i++){  fscanf(fp,"%f,%f,%f\n",&e1,&e2,&e3);  m[i][0]=e1;  m[i][1]=e2;  m[i][2]=e3; } fclose(fp); fp=fopen("data01.txt","w"); for(j=0;j<30;j++){  fprintf(fp,"%f,%f,%f\n",m[j][0],m[j][1],m[j][2]); } fclose(fp); getch(); exit(0); } データの読み込みがうまくいってないのだと思いますがわかりません。 間違いがあったならご指摘お願いします。

  • テキストファイルの出力について

    今、学校の課題でC言語を使ってプログラムを作っています。 20000個のデータを読み込んで、200個ずつに区切り、別々のテキストファイルで出力するというものです。 最初につくったのは、以下の通りです。 *********************************************** FILE *fp; { int b,i=0; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; fp = fopen("D1.txt","w"); for(i=0;i<=199;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); fp = fopen("D2.txt","w"); for(i=200;i<=399;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); ・・・ ***************************************** これだと20000まで繰り返し記述しなければならずかなり困難だと思いました。そこで、ループを作ろうとしたのですが、テキストファイルをループを使って複数作成する方法がわかりません。 以下のようなプログラムを作ったのですが、テキストファイルが一つしか作られませんでした。 どのように記述すればよいのでしょうか? **************************************** FILE *fp; { int a,i=0; int b=1; int c=199; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; start: fp = fopen("D[1+b].txt","w"); for(i=a;i<=c;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); if(i > c) c = c+200; a = a+200; b++; goto start; fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); fclose(fp); } } ****************************************** よろしくお願い致します。

  • C言語 ファイル処理に関する事

    テキストエディタで打ち込んだファイル 【hw.dat】 Akiba 160 59.3 Kurata 162 51.6 Masaki 182 76.5 Tanaka 170 60.7 Tsuji 175 83.9 Washio 175 72.5 名前・身長・体重のデータです。 <問>   「hw.dat」から読み込んだデータを身長順にソートした上で   表示するプログラムを作成せよ。 下記のプログラムでは実行結果が何も出てきません。 入門レベルのスキルしかありません。何処が良くないのでしょうか。 教えて下さい。 [プログラム]   #include <stdio.h>   #include <string.h>   void swap_double(double *x, double *y)   {   int temp = *x;   *x = *y;   *y = temp;   }   void swap_name(char *sx, char *sy)   {   char *temp;    strcpy(temp, sx);   strcpy(sx, sy);   strcpy(sy, temp);   }   void sort(double *he, double *we, int n)   {   int i, j;    for(i = 0; i < n - 1; i++){   if(*(he - 1) > *he ){ swap_double((he - 1), he); swap_double((we - 1), we); } } }   void sort_name(double *he, char *na, int n)   {    int i, j;    for(i = 0; i < n - 1; i++){   if(*(he - 1) > *he ){ swap_name((na - 1), na); } } }  int main(void)   {    FILE *fp;    int ninzu = 0;    char *name[100];    double height, weight;    double hsum = 0.0;    double wsum = 0.0;    int i;    char *na[i];    double he[6];    double we[6];    if ((fp = fopen("hw.dat", "r")) == NULL)    printf("\aファイルをオープンできません。\n");    else{   for(i = 0; i < 6; i++){   while (fscanf(fp, "%s%lf%lf", name , &height , &weight) != EOF ){ *na = *name; he[i] = height; we[i] = weight; ninzu++; hsum += he[i]; wsum += we[i];   printf("%-10s %5.1f %5.1f\n", na, height, weight);   }   }   printf("------------------------\n");   printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);   }   puts("\n身長順にソートしました。");   for(i = 0; i < 6; i++){ *na = *name; he[i] = height; we[i] = weight; ninzu++; hsum += he[i]; wsum += we[i]; }   for(i = 0; i < 6; i++){   sort(he, we, 6);   sort_name(he, *na, 6);   printf("%-10s %5.1f %5.1f\n", *(na + i) , *(he + i), *(we + i));   }   printf("------------------------\n");   printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);  fclose(fp);   return 0;  }   

  • csvファイルの読み込み

    fscanf関数を用いて、csvファイルの内容を構造体のそれぞれのメンバに読み込んで表示させようとしているのですが、4列目以降が上手く読み込めません。初歩的な質問で申し訳ありませんがどなたか教えてください。 ****************************ソース************************************************ #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME "view_001_McdlData.csv" #define FILE_SIZE 819200 struct Data{ int DataNo; int FrameNo; int SampleNo; char Digital; double voltage; double trigger; double C; double D; }; int main(int argc, char *argv[]) { FILE* fp,*fo, *fi; // ファイルポインタ用 int n, i, file_size; double time,vel[FILE_SIZE]; struct Data *dat; char buff[SIZE]; if ((fp = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); dat = (struct Data*)malloc(file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; //データの読み込み while((fscanf(fp, "%d,%d,%d,%s,%lf,%lf,%lf,%lf",&dat[i].DataNo,&dat[i].FrameNo,&dat[i].SampleNo,&dat[i].Digital,&dat[i].voltage,&dat[i].trigger,&dat[i].C,&dat[i].D)) !=EOF ){ printf("%d %d %d %s %lf %lf %lf %lf\n",dat[i].DataNo,dat[i].FrameNo,dat[i].SampleNo,dat[i].Digital,dat[i].voltage,dat[i].trigger,dat[i].C,dat[i].D); i++; } fclose(fp); return 0; } ***********************************csvファイルの内容************************************ 0,1,0,0x3F,2.270000,0.000000,-1.000000,-1.000000 1,1,1,0x3F,2.260000,0.010000,-1.000000,-1.000000 2,1,2,0x3F,2.260000,0.010000,-1.000000,-1.000000 3,1,3,0x3F,2.260000,0.010000,-1.000000,-1.000000 4,1,4,0x3F,2.260000,0.010000,-1.000000,-1.000000 5,1,5,0x3F,2.260000,0.000000,-1.000000,-1.000000 ***************************************************************************************************

  • txtファイルの文字を配列に格納

    ファイル関数を使ってoutput.txt(txtファイル)の文字を配列に格納するプログラムを作っているのですが、配列に文字を入れられない状態です。 ※参考になるページやアドバイスがあれば宜しくお願い致します。 ■プログラム #include <stdio.h> void main(){ int i; int data[10]; FILE *fp; fp = fopen("output.txt","r"); if(fp == NULL){ printf("ファイルが見つかりません。"); }else{ for(i=0;fp != EOF;i++){ data[i] = fgetc( fp ); } } } ■output.txt 001 100 猫A 好きな物 ねこまんま 002 200 猫B 好きな物 キャットフード

  • ファイル入出力について教えて下さい。

    ご覧いただきありがとうございます。 数値を入力して、数値を出力する方法を教えて頂きたいです。 ・   ・   ・ fp = fopen( "a.txt", "a" ); for( i = 16383; i >= 0; i-- ) { fprintf( fp, "%d", i ); } fclose( fp ); ・   ・   ・ data = (int *)malloc(32768); fp = fopen( "a.txt", "r" ); for( i = 0, i <= 16383; i++ ) { fscanf( fp, "%d", data+i ); } fclose( fp ); ・   ・ ・ 以上の記述で、入力はうまくいくのですが、出力の際に数値でなくなってしまいます。どうしてでしょうか? ご存じの方がおりましたら、ご回答よろしくお願いいたします。

専門家に質問してみよう