以下代码读取同一目录中的文本文件,并按相反顺序在文件中打印出每行。例如,将文本文件我读:
线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;
}
相反,我的意思是它指向一个分配的内存块,其地址分配给l1,这是一个空的但分配的块。 – Shiri
@Shiri你认为'malloc(sizeof line)'有什么作用? – 2013-06-28 09:55:54
创建一个足够大的内存块以适合struct-type行并返回它的地址...对吗? – Shiri