ファイルが読み込めない?
Posted: 2007年5月15日(火) 08:15
いつもお世話になっています。
今回も質問させていただきたいと思います。よろしくお願いします。
ファイルをrで読み込む、qなら終了、dでそれを表示して、sで名前などの順番にソートするプログラムなのですがrで読み込む段階でエラーがでてきてしまいます。
コマンドsを新しく作る前まではちゃんとできていたのでsの部分が悪いと思うのですがどこかわかりません。
ソースは
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
というふうにでます。
間違っている点を教えていただけるとうれしいです。
今回も質問させていただきたいと思います。よろしくお願いします。
ファイルを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
というふうにでます。
間違っている点を教えていただけるとうれしいです。