2014-03-05 57 views
-2

我试图做一个程序,让用户添加,编辑,查看,加载和保存课程,并计算它们的GWA(一般加权平均)。唯一不起作用的功能是加载/阅读课程!阅读和结构的C编写

,所以这是我的结构:

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; 
} 

我不知道为什么,但它会导致分段错误。

这就是我所谓的负载课程

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是一个STRING WITH SPACES。我如何正确地打电话给他们?

+0

显示更多的代码,即如何调用'loadCourses()'。还要确保'fopen()'成功,否则'fp'是'NULL',这不利于传递给'fscanf()'。 – unwind

+0

这是正确的之前,首先调用的fscanf与调试“NULL” –

+0

运行它的检查,你会看到它崩溃 –

回答

0

这是因为用户可以定义数目少于结构的可用数量较高的纪录。

struct studrec s[MAX_COURSES] //the struct defined 

所以,你必须检查,以检查是否从用户输入:

fscanf(fp, "%d\n", &n); 

2

fclose(NULL)free(NULL)不同于MAX_COURSES不超过:只有后者被指定为“没做什么”。

fclose(NULL)是不确定的行为,并且将在微软的实现C标准库的明确崩溃。因此,你应该将你的电话fclose(fp);里面if