2013-06-28 83 views
1

以下代碼讀取同一目錄中的文本文件,並按相反順序在文件中打印出每行。例如,將文本文件我讀:
線1
線2
線3以相反順序讀取文件行(Structs,members,malloc)

這將打印出來:
線3
線2
線1

和它那麼,真正的問題是什麼?這個問題不是關於修復某些代碼的功能,而是我在寫作方面有一點幫助,但更多的是瞭解代碼以及它的功能和完成它的方式。

我對C很陌生(一直在學習幾天),所以如果我不理解相對簡單的東西,請不要尖叫。

問題:

在第一while循環我已分配的內存塊大到足以存儲結構類型「行」和定義的類型「線」的指針「L1」持有的該地址分配內存。現在是問題所在。在下面的代碼行中,另一個內存塊被分配給一個字符串,該字符串的緩衝區足夠大,以保存指針被定義爲l1->行的文本文件中讀取的每個字符串的大小。

對我來說這似乎是不合邏輯的,因爲'l1'只被定義爲'line'類型的指針,但是在這個while循環的第二行'l1-> lines'表明我已經聲明瞭輸入'line'命名爲'l1',我訪問其中一個成員('行'),並將該結構成員的地址分配爲新分配的內存塊的地址。這意味着'l1'是一個既指向結構也指向內存塊的指針。

從這一切我可以清楚地說,我對發生的事情的理解是傾斜的,並不是正確的。有人可以請賜我什麼似乎是一個微不足道的問題?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h>  

typedef struct line { 
    char *lines; 
    struct line *prev; 
} line; 

FILE *file; 
int main() { 

    line *tail = NULL; 
    file = fopen("text.txt","r"); 
    char line1[80]; 

    while (fgets(line1,80,file)!=NULL) { 
    line *l1 = malloc(sizeof(line)); 
    l1->lines = malloc(strlen(line1)+1); 
    strcpy(l1->lines,line1); 
    l1->prev = tail; 
    tail = l1; 
    } 

    line *current; 
    current = tail; 

    while (current != NULL) { 
    printf("%s\n",current->lines); 
    current = current->prev; 
    } 
    return 0; 

} 

回答

0

這意味着,「L1」是指向兩者結構,並且還指向一個存儲塊。

我不明白這是什麼問題。結構駐留在內存佔用一些內存塊。

順便說一句,所有這些代碼都會建立一個鏈表,然後向後走。

+0

相反,我的意思是它指向一個分配的內存塊,其地址分配給l1,這是一個空的但分配的塊。 – Shiri

+0

@Shiri你認爲'malloc(sizeof line)'有什麼作用? – 2013-06-28 09:55:54

+0

創建一個足夠大的內存塊以適合struct-type行並返回它的地址...對嗎? – Shiri