2013-07-13 103 views
-1

我試圖讀取的數據文件,並存儲該信息到過程結構的陣列(或指針數組到當然結構)的陣列。此分配需要使用指向學生結構的指針數組維護數據庫。讀取數據文件,並存儲到結構

當我嘗試將數據文件掃描到陣列中時,出現分段錯誤。我怎樣才能正確地將文件中的信息存儲到數組中?

#define SIZE  30 
#define fieldLength 300 
#define diskFile "diskFile.dat" 
#define courseFile "course.dat" 

struct student 
{ 
    char name[fieldLength]; 
    int age[fieldLength]; 
    char course1[fieldLength]; 
    char course2[fieldLength]; 
    char remarks[fieldLength];  
}*sp[SIZE]; 

struct course 
{ 
    char name[fieldLength]; 
    char number[fieldLength]; 
    char instructor[fieldLength]; 
    char date[fieldLength]; 
    char starting[fieldLength]; 
    char ending[fieldLength]; 
    char location[fieldLength]; 
}; 

int main(int argc, char *argv[]) 
{ 
    int i, count; 

    struct course course_arr[SIZE]; // an array of ten structs 

    FILE * in; /*FILE pointer to do the stream IO*/ 
    in = fopen(courseFile, "r+"); 

    count = 0; 
    while ((fscanf(in, "%s %s %s %s %s %s %s", 
         &course_arr[count].name, 
         &course_arr[count].number, 
         &course_arr[count].instructor, 
         &course_arr[count].date, 
         &course_arr[count].starting, 
         &course_arr[count].ending, 
         &course_arr[count].location)) != EOF) 
    {  
     count++;   
    } 

    /* print the menu */ 
    printf("\n-----------------------------------------------------------------\n"); 
    printf("|\t%-20s","(N)ew record"); 
    printf("%-20s","(U)pdate record"); 
    printf("Swa(p) records\t|\n"); 
    printf("|\t%-20s","(S)ort database"); 
    printf("%-20s","(C)lear database"); 
    printf("(D)isplay db\t|\n"); 

    printf("|\t%-20s","(L)oad disk"); 
    printf("%-20s","(W)rite disk"); 
    printf("(E)mpty disk\t|\n"); 

    printf("|\t%-20s", "(V)iew courses"); 
    printf("%-20s","(R)emove record"); 
    printf("(Q)uit \t|\n"); 
    printf("-----------------------------------------------------------------\n"); 
    printf("choose one: "); 
+1

緩衝區溢出是一件真實的事情。閱讀它。 –

回答

0

常規fscanf永遠不會返回EOF。 測試fscanf小於預期的字段數:

count = 0; 
while((fscanf(in, "%s %s %s %s %s %s %s", &course_arr[count].name, &course_arr[count].number, &course_arr[count].instructor, &course_arr[count].date, &course_arr[count].starting, &course_arr[count].ending, &course_arr[count].location)) < 7){ 
    count++; 
} 
+1

'fscanf'不會返回'EOF',見C11標準的7.21.6.2廣告16。 –

+0

哎呀,是的,實際上是讀文件用完後或返回EOF讀取錯誤。所以我建議測試不同於7的返回值,簡單地說。 – Djee

-1

你檢查的文件你正在閱讀的存在或不存在。

增加波紋管

in = fopen(courseFile, "r+"); 

if(in == NULL) 
     { 
     printf("exit"); 
     exit(0); 
     } 

我想這可能是問題。

0

我覺得這是更好地與 同時工作(函數getline(字符串變量,,)!= EOF)。(看在網上上argumentsto放在函數getline) 然後用字符串變量工作。查看數據存儲到txt文件的格式。例如:名稱(空白)編號(空白)教師(空白)日期(空白)開始(空白)結束位置 開始尋找string_variable中的空白。當你看到第一個空白時,將位置1到位置空白-1的子字符串複製到course_arr [count] .name變量中,然後將位置1的子字符串刪除到空白位置。再次查找第一個空白,並將子字符串存儲到course_arr [count] .number等等。

對不起,我的英語希望你長了意義

0

你應該失去所有的& S IN的fscanf通話。 char數組已經作爲指針傳遞。如果您想使用上gcc-Wall選項(或任何其他編譯器的類似選項),它會提醒你這一點。

相關問題