2014-03-05 104 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