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

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了,你如果想整体将结构体写入文件,那么你需要确保没有复杂的结构对象,或者你自己实现序列化才可以

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 闭上左眼看世界 2018-03-22 12:14
    关注

    看错误信息是内存访问异常了.

    评论
  • 有点贪玩 2018-03-23 01:20
    关注

    test.data = "Anthony";
    修改为
    string s = "Anthony";
    test.data = s;
    试试?

    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥16 CATIA联合修剪怎么不让他变透明啊
  • ¥20 ERR_CACHE_MISS 确认重新提交表单
  • ¥20 关于vba使用HTMLfile执行js函数问题
  • ¥60 悬赏求解,通过实时现场摄像头的视频图像识别其他对家打出的麻将牌,识别麻将牌,识别牌墙位置,通过识别对家打出了什么牌
  • ¥15 关于#GPU jetson#的pcie驱动开发问题,如何解决?
  • ¥15 stm32f103zet6 串口5无法收发数据
  • ¥15 关于C语言使用线程队列实现多线程并发
  • ¥15 这个运行,错误在哪里呀,大家看看吧,教导我
  • ¥15 advanceinstaller对话框设置
  • ¥100 正常上网,内部网页无法打开