今回も質問させていただきたいと思います。よろしくお願いします。
ファイルをrで読み込む、qなら終了、dでそれを表示して、sで名前などの順番にソートするプログラムなのですがrで読み込む段階でエラーがでてきてしまいます。
コマンドsを新しく作る前まではちゃんとできていたのでsの部分が悪いと思うのですがどこかわかりません。
ソースは
#include <stdio.h> #include <stdlib.h> #include <string.h> int cmp_name(const void *a,const void *b); int cmp_eng(const void *a,const void *b); int cmp_mat(const void *a,const void *b); int cmp_sci(const void *a,const void *b); typedef struct score{ char name[40]; int eng; int mat; int sci; } Score; Score *data; int main(void) { FILE *fp; char cmd[20], fname[20], rank, member[6]; int j=1,number; while (rank!='q'){ printf("CMD>"); fflush(stdout); fgets(cmd, 20, stdin); sscanf(cmd, "%c %s", &rank, fname); switch(rank){ case 'r': if ((fp = fopen(fname, "r")) == NULL){ printf("Cannot open the File!\n"); return (-1); } for(j=1;j<=number;j++){ fscanf(fp, "%s %d %d %d", data[j].name, &data[j].eng, &data[j].mat, &data[j].sci); } break; case 'd': fgets(member, 6, fp); sscanf(member,"%d",&number); data=(Score*)malloc(sizeof(Score)*number); for(j=1;j<=number;j++){ fscanf(fp, "%s %d %d %d", data[j].name, &data[j].eng, &data[j].mat, &data[j].sci); printf("名前:%s\n",data[j].name); printf("英語:%d\n",data[j].eng); printf("数学:%d\n",data[j].mat); printf("理科:%d\n\n",data[j].sci); } break; case 'q': fclose(fp); printf("File close!\n"); break; case 's': if(!strcmp(fname,"name")){ qsort(data,number,sizeof(Score),cmp_name); }else if(!strcmp(fname,"eng")){ qsort(data,number,sizeof(Score),cmp_eng); }else if(!strcmp(fname,"mat")){ qsort(data,number,sizeof(Score),cmp_mat); }else if(!strcmp(fname,"sci")){ qsort(data,number,sizeof(Score),cmp_sci); } break; default: printf("コマンドを正しく入力してください\n"); } } return (0); } int cmp_name(const void *a,const void *b) { Score *va,*vb; va=(Score*)a;vb=(Score*)b; return(strcmp(va->name,vb->name)); } int cmp_eng(const void *a,const void *b) { Score *va,*vb; va=(Score*)a;vb=(Score*)b; return(va->eng - vb->eng); } int cmp_mat(const void *a,const void *b) { Score *va,*vb; va=(Score*)a;vb=(Score*)b; return(va->mat - vb->mat); } int cmp_sci(const void *a,const void *b) { Score *va,*vb; va=(Score*)a;vb=(Score*)b; return(va->sci - vb->sci); }でファイルは
3
a 10 20 30
b 40 10 20
c 30 30 10
エラーメッセージ
CMD>r data1.txt
4 [main] ex04 972 _cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
1038 [main] ex04 972 open_stackdumpfile: Dumping stack trace to ex04.exe.stackdump
というふうにでます。
間違っている点を教えていただけるとうれしいです。