回复 5楼 embed_xuel
pr=pr->next;这一句删了
#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <conio.h> struct clerk { char clerkNum[10]; char name[20]; int age; char position[10]; double salaries; struct clerk* next; }; const char file_name[] = "e:\\Projects\\test\\test_Clerk\\clerk.dat"; void init_data(const char* file_name); void print_data(const clerk* data); bool save_data(const char* file_name, const clerk* data, const int count); clerk* load_data(const char* file_name); void release(clerk* data); void main(void) { // 初始化测试数据 // init_data(file_name); // 从文件中读入链表数据并输出 clerk* data = load_data(file_name); clerk* p = data; while (p != NULL) { print_data(p); p = p->next; } _getch(); release(data); data = NULL; } void init_data(const char* file_name) { const clerk data[] = { { "001", "lusvan", 20, "beijing", 3000.0, NULL }, { "002", "hellovfp", 30, "shanghai", 5000.0, NULL }, { "003", "embed_xuel", 28, "shenyang", 5000.0, NULL } }; save_data(file_name, data, _countof(data)); } void print_data(const clerk* item) { printf_s(" Num: %s\n", item->clerkNum); printf_s(" Name: %s\n", item->name); printf_s(" Age: %d\n", item->age); printf_s("Position: %s\n", item->position); printf_s("Salaries: %.2f\n", item->salaries); printf_s("\n"); } bool save_data(const char* file_name, const clerk* data, const int count) { bool success = false; FILE* file; if (fopen_s(&file, file_name, "wb") == 0) { success = true; for (int i = 0; i < count; ++i) { if (fwrite(&(data[i]), sizeof(clerk), 1, file) != 1) { success = false; break; } } fclose(file); } else { printf_s("Data file open error!\n"); } return success; } clerk* load_data(const char* file_name) { clerk* head = NULL; // 链头 FILE* file; if (fopen_s(&file, file_name, "rb") == 0) { clerk item; // 中介数据项 clerk* p = NULL; // 当前结点指针 clerk* previous = NULL; // 前项结点指针 bool first = true; while (fread(&item, sizeof(clerk), 1, file) == 1) // 从文件中读入一笔记录 { if ((p = (clerk *)malloc(sizeof(clerk))) != NULL) // 申请结点内存空间 { memcpy(p, &item, sizeof(clerk)); // 把读入的数据项复制给当前结点 p->next = NULL; // 初始化下项指针 if (previous != NULL) { previous->next = p; // 如果有前项,则令前项的下结点指针指向当前结点 } previous = p; // 令当前结点成为下一项的前项 if (first) { head = p; // 如果这是第一笔记录,则它是链表头,用于返回作为链表的入口 first = false; } } else { break; } } fclose(file); } return head; // 返回链表头 } void release(clerk* data) { clerk* next = NULL; while (data != NULL) { next = data->next; free(data); data = next; } }