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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:00:03