C++仅含整型成员的结构体二进制读写操作失效问题求助
C++ 结构体二进制读写失败问题解决方案
核心问题排查
- 写入数据后未刷入缓存:
ofstream的write操作只会把数据写入用户态缓冲区,默认不会立刻刷入磁盘,你写完直接读取时数据还没落到文件中,自然读不到内容 - 读取操作实际执行失败:你没有校验
in.read()的返回值,实际上本次读取没有拿到任何有效数据,new对象的成员还是初始化时的100,所以你输出的是初始化值,不是文件读取结果 - 多流打开同一文件不同步:你同时用独立的
ifstream和ofstream打开同一个文件,两个流的状态没有同步机制,也会导致读写逻辑异常
补充:你原代码中使用
new作为变量名属于语法错误,new是C++保留关键字,不允许用作自定义变量名。
修复方案
- 写入完成后调用
out.flush()强制刷入缓存,或者直接关闭写流,确认数据已经写入磁盘 - 每次读写操作后校验返回值,确认操作成功
- 单文件读写优先使用
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
相关产品推荐
相关产品推荐

