2014-05-21 86 views
0

我試圖讀取包含以下內容的文件。將文件讀入鏈接列表

59878, Moby Dick 
442419, The Peach 
535, Moby Dick 
12, History of War 

我有一個鏈接列表保存整數類型和另一個持有一個字符和鏈接列表指針。這是在後者鏈表中的節點:

typedef struct Node { 
    struct Node* prev; 
    char *title; 
    ListRef library; //Pointer to a different linked list 
    struct Node* next; 
} Node; 

typedef struct Node* NodeRef; 

NodeRef newNode(char *bookTitle, List LL) { 
    NodeRef node = (Node*)malloc(sizeof(Node)); 
    node->next = node->prev = NULL; 
    node->title = (char*)calloc(60, sizeof(char)); 
    node->library = newList(); 
    node->library = LL; 
    node->title = bookTitle; 
return(node); 

}

+0

「從文件讀取值」和「讀取文件輸入」有什麼區別?你能給我們一個[最小完整的例子](http://www.sscce.org)嗎? – Beta

+0

對不起,我不確定那裏有多餘的句子。 – user3662681

回答

0

您應該title存儲與

node->title = strdup(bookTitle); 

取出calloc線,爲strdup會爲你做內存分配。


由於代碼當前寫的,你的字符串分配內存,但隨後行

node->title = bookTitle; 

改變指針,使其指向緩衝區bookTitle點。據推測,您正在重新使用緩衝區,因此在程序結束時,所有標題都指向相同的緩衝區,並且該緩衝區包含從文件中讀取的最後一個標題。

+0

考慮到你正在假設一個最大長度,這是明智的,你可能想使用'strndup'長度爲60而不是'strdup'(這是一個很好的習慣)。在教學上,還值得一提的是,這會導致內存泄漏:分配給'node-> title'的內存永遠不能被釋放。 –

+0

我明白了,現在我明白了。謝謝你的建議。 – user3662681

0
NodeRef newNode(char *bookTitle, List LL) { 
    NodeRef node = (Node*)malloc(sizeof(Node)); 

僅供參考:以上行不需要轉換malloc()返回的值。相反,行可能是:NodeRef node = malloc(sizeof(Node));

node->next = node->prev = NULL; 
    node->title = (char*)calloc(60, sizeof(char)); 

現在節點 - >標題分數爲60個字節的分配塊。

node->library = newList(); 
    node->library = LL; 
    node->title = bookTitle; 

所以,booktitle是一個指向包含字符串的內存的指針。上述語句導致node-> title指向bookTitle指向的同一事物。對於之前指出的60個字符的分配塊太糟糕了;這種記憶現在無法恢復孤兒。 (我確信這不是我想要的)。

上面一行應改爲類似以下內容:

// Assumption: bookTitle contains a properly terminated C string. 
    node->title = strdup(bookTitle); 
    if(NULL == node->title) 
    { 
    fprintf(stderr, "strdup() failed!\n"); 
    /* and handle the error, even though you may never actually see it... */ 
    ... 
    } 

    return(node); 
} 

隨着新節點被創建,它們都指向同一個項目,包含在「BOOKTITLE」的地址。因此,在打印列表時,這是(危險地)你得到的。所有節點都指出了最後一本書的書名。

+0

謝謝你的解釋。我最近纔開始使用C. – user3662681