2012-12-07 66 views
-2

我寫了這個函數(下面)。它應該逐行讀入文件。編輯該行並將某些單詞/字符放入各種功能中。然後將這些函數放入「入門」結構的數組(malloc)中。將增加到malloc數組的值變成malloc數組中的所有值

問題是,當我然後退出循環並嘗試打印出數組時,最後一個結構體名稱變量放入數組中是打印出來的唯一名稱變量。例如,如果我嘗試打印數組的前10個結構體名稱變量,則會打印出最後一個結構體名稱變量10次。整數(數字變量)工作正常但是。

我使用fgets()來讀取文件的行,並在文件末尾從循環中斷開。可能fgets()可能是問題,但似乎不太可能...

我不知道什麼問題,但正如我所說的數字變量打印罰款,但名稱打印出最後一個只。

但是從文件中獲取信息卻沒有。如果把我的循環打印語句放在while循環中,它仍然不起作用。

有一點需要注意的是,使用strtok,strcpy和strcat將行放入單獨的變量工作正常。我不認爲這是它造成的。

struct entrant { 
    int number; 
    char *name; 
}; 


void read_in_entrants(char fileName[]) { 
    FILE *fr; 
    fr = fopen(fileName, "rt"); 

    //Init. 
    struct entrant * entrant_array = (struct entrant*) malloc(sizeof (struct entrant)); 
    int j, temp, k = 0; 
    int *number; 
    char line[80]; 
    char name[80]; 
    char surname[80]; 

    while(1) { 
     //Read line in file. 
     fgets(line, 80, fr); 

     //If at end of file break from loop. 
     if (feof(fr)) break; 

     //Edit line to be stored in variables. 
     number = strtok(line, " "); 
     strcpy(name, strtok(NULL, " ")); 
     strcpy(surname, strtok(NULL, " ")); 
     strcat(name, " "); 
     strcat(name, surname); 

     //Add variables to struct array. 
     entrant_array[k].number = atoi(number); 
     entrant_array[k].name = name; 
     printf(" %d %s\n", entrant_array[k].number, entrant_array[k].name); 

     //Handle malloc array memory. 
     temp = realloc(entrant_array, (k + 2) * sizeof (struct entrant)); 
     if (temp != NULL) { 
      entrant_array = temp; 
     } else { 
      free(entrant_array); 
      printf("Error in memory allocation!"); 
      return 1; 
     } 
     //Increase k. 
     k++; 
    } 

    //Print struct values in array. 
    for (j = 0; j < 10; j++) { 
     printf(" %d %s", entrant_array[j].number, entrant_array[j].name); 
    } 

    //Shut down. 
    free(entrant_array); 
    fclose(fr); 
} 

無論如何,我一直在努力這個字面上幾個小時,現在我只是無法修復它。我對C的知識是非常有限的,我很遺憾我需要做些什麼來解決這個問題。

感謝您的幫助,這是非常讚賞:)

+1

嘗試通過逐漸簡化代碼來減少問題。 – krlmlr

+0

使用調試器(例如gdb)和內存泄漏檢測器(valgrind)編譯所有的警告和調試信息(例如'gcc -Wall -g'),改進代碼直至不給出警告。 –

+0

對不起,我認爲整個功能會更有幫助:) – DanMc

回答

4

entrant.name是一個指針,你被分配到相同的本地字符數組。所以所有的指針指向相同的變量,它將包含你讀的最後一件事。在它超出範圍之前,它將指向隨機存儲器。

最快的解決將與

entrant_array[k].name = strdup(name); 

更換

entrant_array[k].name = name; 

但是,你需要記住稍後釋放內存。

+0

非常感謝工作:) – DanMc