使用二进制文件流存储员工信息的C语言代码存在什么错误?
现有代码的核心问题
- 结构体定义错误:
Employee的name成员是未初始化的野指针,没有申请内存空间,scanf直接向e.name写入数据属于非法内存访问,会直接导致程序崩溃。同时结构体存储的是指针地址而非实际姓名内容,就算写入文件成功,后续读取时该指针地址指向的内存已经无效,完全无法获取姓名数据。 - 读写逻辑不匹配:使用
fwrite写入的是Employee结构体的二进制内容(包含指针+3个int型数据),读取时却把二进制内容直接读到字符数组中当作字符串打印,格式完全不匹配,只会输出乱码或者触发程序崩溃。 - 缺少异常判断:没有判断
fopen的返回值,当文件因为权限、路径等问题打开失败时,后续操作空指针会直接崩溃。 - 功能不符合需求:仅支持单次输入,无法处理未知数量的员工信息,且操作的文件名和题目要求的
expire.bin不匹配。
正确实现方案
首先将结构体的姓名字段修改为定长字符数组,避免指针读写问题:
typedef struct { char name[64]; // 定长数组直接嵌入结构体,可直接进行二进制读写 int id, age, salary; } Employee;
写入程序(存储员工信息到expire.bin)
#include <stdio.h> #include <string.h> typedef struct { char name[64]; int id, age, salary; } Employee; int main() { FILE* fout = fopen("expire.bin", "wb"); if (fout == NULL) { printf("文件打开失败\n"); return 1; } Employee e; printf("请输入员工姓名 ID 年龄 薪资(输入quit结束输入):\n"); // 循环读取支持任意数量输入 while (scanf("%s", e.name) == 1) { if (strcmp(e.name, "quit") == 0) break; scanf("%d %d %d", &e.id, &e.age, &e.salary); fwrite(&e, sizeof(Employee), 1, fout); } fclose(fout); printf("员工信息已写入expire.bin\n"); return 0; }
读取程序(读取expire.bin内容输出到屏幕)
#include <stdio.h> typedef struct { char name[64]; int id, age, salary; } Employee; int main() { FILE* fin = fopen("expire.bin", "rb"); if (fin == NULL) { printf("文件打开失败\n"); return 1; } Employee e; printf("姓名\tID\t年龄\t薪资\n"); // 循环读取直到文件结束 while (fread(&e, sizeof(Employee), 1, fin) == 1) { printf("%s\t%d\t%d\t%d\n", e.name, e.id, e.age, e.salary); } fclose(fin); return 0; }
内容的提问来源于stack exchange,提问作者y J.
相关产品推荐
相关产品推荐

