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

C++仅含整型成员的结构体二进制读写操作失效问题求助

C++ 结构体二进制读写失败问题解决方案

核心问题排查

  • 写入数据后未刷入缓存:ofstream的write操作只会把数据写入用户态缓冲区,默认不会立刻刷入磁盘,你写完直接读取时数据还没落到文件中,自然读不到内容
  • 读取操作实际执行失败:你没有校验in.read()的返回值,实际上本次读取没有拿到任何有效数据,new对象的成员还是初始化时的100,所以你输出的是初始化值,不是文件读取结果
  • 多流打开同一文件不同步:你同时用独立的ifstream和ofstream打开同一个文件,两个流的状态没有同步机制,也会导致读写逻辑异常

补充:你原代码中使用new作为变量名属于语法错误,new是C++保留关键字,不允许用作自定义变量名。

修复方案

  1. 写入完成后调用out.flush()强制刷入缓存,或者直接关闭写流,确认数据已经写入磁盘
  2. 每次读写操作后校验返回值,确认操作成功
  3. 单文件读写优先使用fstream,避免多流状态不同步问题

修复后示例代码

#pragma pack(1)
struct test {
    int m_id;
    int m_size; 
    test(int id, int size) :m_id(id), m_size(size) {}
    test() {};
};
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    // 先执行写入逻辑
    ofstream out("binFile", ios::binary | ios::out);
    if (!out.is_open()) {
        cout << "写文件打开失败" << endl;
        return -1;
    }
    test old(1, 7);
    out.write(reinterpret_cast<char*>(&old), sizeof(old));
    // 刷入缓存并关闭写流,确保数据落盘
    out.flush();
    out.close();

    // 再执行读取逻辑
    ifstream in("binFile", ios::in | ios::binary);
    if (!in.is_open()) {
        cout << "读文件打开失败" << endl;
        return -1;
    }
    test new_obj;
    if (in.read(reinterpret_cast<char*>(&new_obj), sizeof(new_obj))) {
        cout << "读取成功,m_size值为:" << new_obj.m_size << endl; // 此处会输出写入的7
    } else {
        cout << "读取失败" << endl;
    }
    in.close();
    return 0;
}

内容的提问来源于stack exchange,提问作者ArunJose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:15:03