我正在尝试制作一个程序,让用户添加、编辑、查看、加载和保存类(class)并计算他们的 GWA(一般加权平均值)。唯一不起作用的功能是类(class)的加载/阅读!
这是我的结构:
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;
}
我不知道为什么,但它会导致段错误。
这就是我所说的加载类(class)
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 是一个带有空格的字符串。我该如何正确称呼他们?
最佳答案
fclose(NULL)
与 free(NULL)
不同:只有后者被指定为“不执行任何操作”。
fclose(NULL)
是未定义的行为,并且会在 Microsoft 的 C 标准库实现上显式崩溃。因此,您应该将 fclose(fp);
调用移至 if
block 的内部。
关于c - C 结构体的读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22194488/