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

如何在C语言中从文件读取数据并存储到链表中

实现文本文件读取并构建链表的完整方案

没问题,我来帮你搞定这个从文本文件读取姓名和ID并构建链表的功能!先梳理下思路,再给出完整代码和关键细节说明。

前提假设

首先假设你的文本文件格式是每行存储一个姓名和对应的ID,比如:

Alice 1001
Bob 1002
Charlie 1003

如果你的文件格式不同(比如用逗号分隔),只需要调整读取逻辑即可。

完整的文件读取函数实现

下面是完成的ReadFileToList函数,它会读取指定文件内容,调用你提供的NewList函数把数据插入链表:

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

// 你提供的结构体和链表定义
struct Prova { char nome[16]; int id; };
typedef struct Node { struct Prova struttura; struct Node * next; }TNodo;
typedef TNodo* Nodo;

// 你提供的创建链表节点函数
void NewList(struct Prova p, Nodo * pp) {
    Nodo temp;
    temp = (Nodo)malloc(sizeof(struct Node));
    temp->struttura = p;
    temp->next = *pp;
    *pp = temp;
}

// 实现完成的文件读取函数
void ReadFileToList(const char* filename, Nodo *pp) {
    FILE* file = fopen(filename, "r");
    if (!file) {
        perror("无法打开文件");
        return;
    }

    struct Prova temp_prova;
    // %15s确保不会超出nome的16字节限制(留1位给字符串终止符)
    while (fscanf(file, "%15s %d", temp_prova.nome, &temp_prova.id) == 2) {
        // 调用NewList把当前数据插入链表
        NewList(temp_prova, pp);
    }

    fclose(file);
}

// 可选:辅助函数,遍历打印链表内容,用于验证结果
void PrintList(Nodo head) {
    Nodo current = head;
    while (current != NULL) {
        printf("Nome: %s, ID: %d\n", current->struttura.nome, current->struttura.id);
        current = current->next;
    }
}

// 可选:辅助函数,释放链表内存,避免内存泄漏
void FreeList(Nodo *pp) {
    Nodo current = *pp;
    Nodo next_node;
    while (current != NULL) {
        next_node = current->next;
        free(current);
        current = next_node;
    }
    *pp = NULL;
}

// 主函数示例:调用读取函数并验证结果
int main() {
    Nodo list_head = NULL;
    ReadFileToList("dati.txt", &list_head);
    
    printf("链表内容:\n");
    PrintList(list_head);

    FreeList(&list_head);
    return 0;
}

关键细节说明

  • 文件打开检查:必须检查fopen的返回值,如果返回NULL说明文件不存在或无法访问,用perror可以打印具体错误原因。
  • 安全读取姓名:用%15s而非%s,因为nome数组长度是16,这样能避免缓冲区溢出问题。
  • 读取结果验证:fscanf的返回值是成功读取的变量数量,我们需要确保每次都读取到了姓名和ID两个数据,所以判断返回值是否等于2,这样可以跳过文件末尾或格式错误的行。
  • 内存管理:记得最后调用FreeList释放链表的所有节点,避免内存泄漏。

格式调整提示

如果你的文本文件不是空格分隔(比如用逗号Alice,1001),只需要把fscanf的格式字符串改成"%15[^,],%d"即可,这样会读取到逗号前的姓名,再读取后面的ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:20:22