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

