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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:36:01