逐行读入链表

时间:2014-09-09 11:48:11

标签: c linked-list fgets

我想将每行放在链接列表中的节点中的文本文件中。我已经设法逐行写出文本,但是当我尝试将行存储在节点中时,只有文本的最后一行保存在所有节点中。知道我做错了吗?

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

struct list
{
    char *line;
    struct list *next;
};

int main(void)
{
    FILE *f;
    f = fopen("text.txt", "r");
    if (f == NULL) exit("ERROR\n");

    struct list n1, n2, n3, n4;
    struct list *pointer = &n1;

        n1.line = NULL;
        n1.next = &n2;
        n2.line = NULL;
        n2.next = &n3;
        n3.line = NULL;
        n3.next = &n4;
        n4.line = NULL;
        n4.next = 0;

    int nodenr = 0;

    int buf[50];
    while(fgets(buf, sizeof(buf), f) != NULL)
    {
        printf("%s", buf);
        ++nodenr;
        if (nodenr == 1)
        {
            n1.line = buf;
        }
        else if (nodenr == 2)
        {
            n2.line = buf;
        }
        else if (nodenr == 3)
        {
            n3.line = buf;
        }
        else if (nodenr == 4)
        {
            n4.line = buf;
        }
    }

    while (pointer != 0)
    {
        printf("%s\n", pointer->line);
        pointer = pointer->next;
    }
    fclose(f);
}

2 个答案:

答案 0 :(得分:1)

您的问题发生的原因是您的所有节点&#39;行指针指向buf缓冲区,因此所有内容都将包含您读入的最后一行。

当你读取每个节点时,你必须为每个节点分配一个缓冲区的副本,而不是缓冲区指针本身。

答案 1 :(得分:0)

我可能有问题 buf 是指针,因此如果您更改 fgets 中的值,则会随处更改...
但在这种情况下,到处都应该有最后一行...

我在C编程方面不太好,如果答案不好,那就很抱歉

相关问题