2013-06-28 84 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