我正在尝试制作一个程序,让用户可以添加,编辑,查看,加载和保存课程,并计算他们的GWA(通用加权平均值)。唯一不起作用的功能是加载/阅读课程!
所以这是我的结构:
struct studrec{
char crsnum[MAX_CNUM];
char crstle[MAX_CTITLE];
float grdobt;
float crscrd;
};
这是我的功能:
int loadCourses( struct studrec s[MAX_COURSES], int n ){
FILE *fp=fopen("savedinputs.txt","r");
int i;
if(fp != NULL){
fscanf(fp, "%d\n", &n);
for(i=0; i<n; i++){
fscanf(fp, "%s \n", s[i].crsnum);
fscanf(fp, "%s \n", s[i].crstle);
fscanf(fp, "%f \n", &s[i].grdobt);
fscanf(fp, "%f \n", &s[i].crscrd);
}
printf("Loaded!");
fclose(fp);
}
else{
printf("Error reading file");
}
return n;
}
我不知道为什么会导致SEGMENTATION FAULT。
这就是我称之为负载课程的方式
main() {
//something working here
do{
ch = dispMenu(ch);
switch(ch){
case 1: cnt = addCourse( crs , cnt );
break;
case 2: editCourse( crs );
break;
case 3: searchCourse( crs );
break;
case 4: dispAllCourses( crs , cnt );
break;
case 5: computeGWA( crs );
break;
case 6: sortCourses( crs , cnt );
break;
case 7: cnt = loadCourses( crs , cnt ); //function call
break;
case 8: saveCourses( crs , cnt );
break;
case 0: printf("\n\tBye!\n");
break;
default: printf("\n\tInvalid Input!\n");
}
}while(ch!=0);
}
输入都是正确的(例如在MAXCOURSES下)
我移动了fclose(fp),但我不得不说s [i] .crstle是一个带空格的字符串。我该怎么称呼他们?
答案 0 :(得分:2)
fclose(NULL)
与free(NULL)
不同:只有后者被指定为“什么都不做”。
fclose(NULL)
是未定义的行为,并且将明确地崩溃Microsoft的C标准库的实现。因此,您应该将fclose(fp);
电话移到 if
区块内。
答案 1 :(得分:0)
这是因为用户可以定义高于可用结构数的记录数。
struct studrec s[MAX_COURSES] //the struct defined
所以你必须检查一下是否输入用户输入:
fscanf(fp, "%d\n", &n);
不大于MAX_COURSES