You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从TXT文件读取链表?附C语言现有代码求助

链表文本文件读取解决方案

问题根源

你当前的Save()函数把链表节点的内存地址(%p)写入了文本文件,但内存地址仅在当前程序运行时有效,重启程序后这些地址完全无效;同时你尝试用fread()读取文本格式内容,这本身就不匹配——fread()是用于读取二进制文件的,而你保存的是纯文本。

修复方案

第一步:修改Save函数,只保存有效数据

删掉Save()里的地址输出,只保存节点的实际业务数据(name和amount),用规整格式方便后续读取:

void Save()
{
    FILE * file = fopen("liste.txt","w");
    if (!file) {
        printf("Failed to open file for writing!\n");
        return;
    }
    node * p = head;
    // 先写入节点总数,读取时可直接按次数循环
    int count = 0;
    node * temp = head;
    while(temp) {
        count++;
        temp = temp->next;
    }
    fprintf(file, "%d\n", count);
    
    while(p != NULL)
    {
        // 用换行分隔字段,确保读取时能准确解析
        fprintf(file, "%s\n", p->name);
        fprintf(file, "%d\n", p->amount);
        p = p->next;
    }
    fclose(file);
}

第二步:实现Read函数,按文本格式重建链表

在function.h中添加Read()函数,按保存的格式读取数据,逐个创建节点并拼接成链表:

void Read()
{
    FILE * file = fopen("liste.txt","r");
    if (!file) {
        printf("Failed to open file for reading!\n");
        return;
    }
    // 读取节点总数
    int count;
    fscanf(file, "%d\n", &count);
    
    // 清空原有链表,避免内存泄漏
    node * temp;
    while(head) {
        temp = head;
        head = head->next;
        free(temp);
    }
    head = NULL;
    
    for(int i=0; i<count; i++) {
        node * new_node = (node*)malloc(sizeof(node));
        if (!new_node) {
            printf("Memory allocation failed!\n");
            fclose(file);
            return;
        }
        // 读取name,处理fgets带入的换行符
        fgets(new_node->name, 256, file);
        size_t len = strlen(new_node->name);
        if(len > 0 && new_node->name[len-1] == '\n') {
            new_node->name[len-1] = '\0';
        }
        // 读取amount
        fscanf(file, "%d\n", &new_node->amount);
        new_node->next = NULL;
        
        // 将新节点加入链表
        if (!head) {
            head = new_node;
        } else {
            node * p = head;
            while(p->next) {
                p = p->next;
            }
            p->next = new_node;
        }
    }
    fclose(file);
    printf("List loaded from txt successfully!\n");
}

额外修复:原代码中的小bug

  • CreateList()里的gets(temp->Denumire)需改为gets(temp->name)(结构体字段为name而非Denumire)
  • scanf("%d\n",&n)中的\n会导致输入后需额外回车才能继续,改为scanf("%d",&n)即可
  • 建议替换不安全的gets()为fgets(temp->name, 256, stdin),并同样处理换行符

内容的提问来源于stack exchange,提问作者blinamx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:02:54