C语言中二进制文件读写结构体数组遇到问题
问题分析与修复方案
你的问题核心很清晰——RestoreEmployees()函数只完成了一半工作:它成功读取了员工数量,但完全没有读取文件中存储的员工结构体数据,所以结构体数组里自然是未初始化的乱码。
修复后的RestoreEmployees()函数
int RestoreEmployees(struct Employees employees[]) { int employeesInDatabase = 0; FILE* fin; // 仅需只读模式打开,无需rb+(读写模式) fin = fopen("EMPLOYEE.DAT", "rb"); if (!fin) { return 0; } // 读取员工数量,增加校验确保读取成功 if (fread(&employeesInDatabase, sizeof(int), 1, fin) != 1) { fprintf(stderr, "读取员工数量失败\n"); fclose(fin); return 0; } // 关键步骤:读取所有员工结构体数据到传入的数组中 if (employeesInDatabase > 0) { size_t readCount = fread(employees, sizeof(struct Employees), employeesInDatabase, fin); if (readCount != employeesInDatabase) { fprintf(stderr, "警告:仅读取到 %zu 名员工,预期 %d 名\n", readCount, employeesInDatabase); } } fclose(fin); return employeesInDatabase; }
修复细节说明
- 补全核心读取逻辑:原代码在读取完员工数量后直接关闭文件,漏掉了
fread(employees, ...)这一关键步骤,这是导致结构体数组乱码的根本原因。 - 优化文件打开模式:使用
"rb"(只读二进制模式)替代"rb+",读取操作不需要写入权限,更符合最小权限原则。 - 增加错误校验:对
fread的返回值做检查,避免因文件损坏、磁盘错误等情况导致的读取异常。
额外注意事项
- 确保传入的
employees数组有足够的内存空间容纳所有员工数据,否则会触发缓冲区溢出问题。 - 保持结构体
struct Employees的内存布局一致:写入和读取时编译器的内存对齐选项不要修改,否则可能出现数据错位。
内容的提问来源于stack exchange,提问作者DeePyson
相关产品推荐
相关产品推荐

