C++中fstream的read和write函数在程序两处位置报错问题
问题原因
崩溃的核心是Student结构体中使用了std::string类型的mName成员。std::string是动态容器,内部仅存储指向堆内存的指针、长度等元数据,实际字符串内容保存在堆空间。直接调用write写入结构体时,只会写入指针值等元数据,不会写入实际的字符串内容;调用read读回结构体时,拿到的指针指向的是已经失效的内存地址,后续访问mName就会触发内存访问错误,也就是你看到的xmemory文件报错。
修复步骤
1. 修改Student结构体定义
将string类型的mName替换为固定长度的字符数组,固定长度数组的内存直接包含在结构体中,支持直接二进制读写:
struct Student { char mName[32] = "Name"; // 长度可根据实际姓名最大长度调整,此处32足够覆盖样例数据 int mAge = 0; double mGrades[4] = { 0, 0, 0, 0 }; double mAverage = 0; };
2. 调整文本加载时的姓名赋值逻辑
原来给string赋值的逻辑改为字符串拷贝,把内容写入char数组:
// 原代码 temp.mName = name; 替换为: strcpy_s(temp.mName, name.c_str());
3. 优化二进制读取的EOF判断
原while (!file.eof())会多读一次无效数据,需要手动resize,更稳妥的写法是把read操作直接放入循环判断条件:
Student temp; // 直接用read返回值作为循环条件,读取成功才会进入循环 while (file.read(reinterpret_cast<char*>(&temp), sizeof(temp))) { students.push_back(temp); // 原有调试输出逻辑可直接放在此处 } // 无需再调用 students.resize(students.size() - 1);
修改完成后重新编译运行,即可正常使用read/write完成二进制文件读写。
内容的提问来源于stack exchange,提问作者Bionic Scout
相关产品推荐
相关产品推荐

