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个回答

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐