-iostream- 2018-03-22 11:41 采纳率: 100%
浏览 4632
已采纳

C++中使用二进制文件保存和读取结构体的问题

为了了解书中的代码,自己编写了下面这段简单的测试代码。
#include
#include
#include

struct Test
{
    int key;
    std::string data;
};

int main()
{
    Test test;
    test.key = 1;
    test.data = "Anthony";
    std::ofstream fout("D:\\Data.dat", std::ios_base::out | std::ios_base::binary);
    fout.write((char*)&test, sizeof Test);
    fout.close();
    std::ifstream fin("D:\\Data.dat", std::ios_base::in | std::ios_base::app | std::ios_base::binary);
    Test test_1;
    fin.seekg(0);
    fin.read((char*)&test_1, sizeof Test);
    std::cout << test_1.key << std::endl;
    std::cout << test_1.key << std::endl;
    std::cout << test_1.data << std::endl;
  std::cout << test_1.data << std::endl;

    system("pause");
    return 0;
}

这段代码编译没有任何问题,但是出现了运行错误(CE)。而且经调试发现错误实在程序执行return 0;之后才发生的。程序运行截图如下。
运行代码后如下:
运行代码后
再按任意键后如下:
按任意键后

调试后发现的异常为:0x00088538 处(位于 FileStruct.exe 中)引发的异常: 0xC0000005: 写入位置 0xDDDDDDDD 时发生访问冲突。****

  • 写回答

3条回答 默认 最新

  • gtsfreer 2018-03-22 14:16
    关注

    这里的问题是string,string类型浅拷贝的结果是两个指针指向同一块区域,那么析构的时候就会遇到double free了,你如果想整体将结构体写入文件,那么你需要确保没有复杂的结构对象,或者你自己实现序列化才可以

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案