如何在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
相关产品推荐
相关产品推荐

