【问题标题】:Read numbers line by line from file and add on linked list从文件中逐行读取数字并添加到链表中
【发布时间】:2021-04-08 09:16:51
【问题描述】:

例如,我有如下两行数字

12,4,11,16,3,20,9,19,17,15

20,3,10,12,18,2,5,14,15,16

我想从 .txt 文件中逐行读取这些数字,每行应该是单独的单链表。我应该为每行创建 10 个不同的变量来存储这些数字吗?我试过了,但我不能以这种方式对这些数字进行任何操作。

这是正确的方法吗?

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

struct list
{
  int data;
  struct list * next;
}list2;

struct list *head=NULL;


typedef struct list list;

void display();



int main() {

  list * node1 = (list *)malloc(sizeof(list));
  list * node2 = (list *)malloc(sizeof(list));
  list * node3 = (list *)malloc(sizeof(list));
  list * node4 = (list *)malloc(sizeof(list));
  list * node5 = (list *)malloc(sizeof(list));
  list * node6 = (list *)malloc(sizeof(list));
  list * node7 = (list *)malloc(sizeof(list));
  list * node8 = (list *)malloc(sizeof(list));
  list * node9 = (list *)malloc(sizeof(list));
  list * node10 = (list *)malloc(sizeof(list));

  FILE *dosya = fopen("data.txt","r");
  int filenum;



  fscanf(dosya,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&node1->data,&node2->data,&node3->data,&node4->data,&node5->data,&node6->data,&node7->data,&node8->data,&node9->data,&node10->data);
  
   return 0;
}

【问题讨论】:

  • 让我回答您的问题“这是正确的方法吗?”还有另一个问题:您的程序有效吗? 如果无效,我认为您可以回答自己的问题。我建议你退后一步,将作业分成更小更简单的子作业,然后再进一步划分,直到不能再划分为止。然后处理并实现一个这样的小子任务,构建和测试它。只有当它起作用时,你才能继续下一个小任务。以此类推,直到您的全部任务都被实施并发挥作用。
  • 你希望做什么fscanf(dosya,"%d",&amp;filenum);?在您的问题中,该文件似乎以逗号分隔的 10 个值的行开头。其中你想读取几行,所以你需要一个循环,并为每个数字分配一个单元格并为每一行制作相应的列表,如果你想保存所有和需要保存每行的第一个单元格和不要松动然后阅读下一行=>您的全局变量 head 不是解决方案,因为只能保存一行的列表。使用 10 个变量不是强制性的,事实上数组存在,这一切都取决于你使用的方式
  • @bruno 我的错误。这一行是关于 .txt 文件中的另一个问题。我想读取每一行并进行一些操作并打印。之后,我将开始读取下一行号。
  • 如@Someprogrammerdude 建议的那样,如果您不能立即直接完成所有操作,您可以逐步进行,例如先忘记列表并读取每行的值并打印它们以进行检查。然后介绍列表等

标签: c list file-io linked-list readfile


【解决方案1】:

为什么要硬编码 10?让我们不要那样做。

struct list *read_list(const char *filename)
{
    errno = 0;
    struct list *head;
    FILE *dosya = fopen("data.txt","r");
    if (!dosya) return NULL;
    head = malloc(sizeof(*head));
    if (fscanf(dosya, "%d", &head->data) < 1) {
        fclose(dosya);
        free(head);
        return NULL;
    }
    for(struct list **ptr = &head->next;;ptr = &ptr[0]->next) {
         *ptr = malloc(sizeof(**ptr));
         if (!*ptr) {
             fclose(dosya);
             return head;
         }
         if (fscanf(dosya, ",%d", &ptr[0]->data) < 1) {
             fclose(dosya);
             free(*ptr);
             *ptr = NULL;
             return head;
         }
    }
}

哇。让我们分解一下。该函数打开文件,初始化一个链表,并将第一个元素读入链表的头部。这是最简单的部分。

然后它运行一个循环,将另一个节点分配到链表的末尾,并将逗号读入空,并将下一个整数读入新节点。如果没有更多的整数,它会删除刚刚添加的节点并返回结果。

如果在文件中找到至少一个整数,则返回列表。检查errno 以判断是否发生了部分读取。

【讨论】:

    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2014-05-03
    • 2017-10-31
    相关资源
    最近更新 更多