gpt4 book ai didi

c - 以相反的顺序读取文件行(结构、成员、malloc)

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:22 24 4
gpt4 key购买 nike

下面的代码读取同一目录中的文本文件,并以相反的顺序打印文件中的每一行。比如我看过的文本文件:
第 1 行
第 2 行
第 3 行

这会打印出:
第 3 行
第 2 行
第 1 行

确实如此,那么真正的问题是什么?这个问题与其说是修复一些我在编写时得到了一些帮助的代码的功能,不如说是关于理解代码及其背后的逻辑以及它是如何完成的。

我是 C 的新手(已经学习了几天)所以如果我不理解一些相对简单的东西,请不要尖叫。

问题:

在第一个 while 循环中,我分配了足够大的内存块来存储结构类型“line”,并定义了“line”类型的指针“l1”来保存分配的内存地址。现在问题来了。在下面的代码行中,为一个字符串分配了另一个内存块,该字符串的缓冲区足够大,可以容纳从文本文件中读取的每个字符串的大小,该文本文件的指针定义为 l1->lines。

对我来说,这似乎不合逻辑,因为“l1”仅被定义为“line”类型的指针,但在这个 while 循环的第二行,“l1->lines”表明我已经声明了一个类型的结构'line' 名为 'l1',我正在访问其成员之一('lines')并将此结构成员的地址分配为新分配的内存块的地址。这意味着 '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;

}

最佳答案

This means that 'l1' is a pointer to both a struct and also a pointer to a memory block.

我不明白这是什么问题。结构驻留在内存中占用一些内存块。

顺便说一句,这段代码所做的就是构建一个链表,然后向后遍历它。

关于c - 以相反的顺序读取文件行(结构、成员、malloc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17361822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com