You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用二进制文件流存储员工信息的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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:06:00