使用char*和std::list将数据结构写入二进制文件

Writing data structure with char* and std::list to binary files

本文关键字:数据结构 二进制文件 list std 使用 char      更新时间:2023-10-16

我正在尝试编写这样的数据结构:

struct dataEntry
{
    std::list<int> listTiles;
    char* pData;
    int nSize;
} 

转换为二进制文件。

我用流写入一个二进制文件:

Write(char* fileName, const dataEntry& dataStruct)
{
    ofstream binFile("fileName, ios::out |      ios::binary | ios::trunc);
    if(binFile.open())
    {
        binFile.write((char*)&dataStruct,     sizeof(dataStruct));
        binFile.close();
    }
}

我用同样的方法读回二进制文件:

Read(char* fileName, const dataEntry& dataStruct)
    { 
        ifstream binFile("fileName, ios::in|      ios::binary );
        if(binFile.open())
        {
            binFile.read((char*)&dataStruct,         sizeof(dataStruct));
            binFile.close();
        }
    }

但是,在读取二进制文件后,我无法遍历列表。它给了我一个异常,说"列表迭代器超出范围"。

第二个问题是,当我第二次尝试读取二进制文件时,"pData"不是我输入的。

int Main()
{
    char* name = "C:\file.dat";
    char* buf = "ABCDEFG";
    dataEntry newData;
    newData.listTiles.push_back(1);
    newData.listTiles.push_back(2);
    newData.nSize = 5;
    newData.pData = buf;
    Write(name, newData);

    Read(name, newData);
    buf = newData.pData; // wrong value when read 2nd time
    newData.listTiles.remove(2); // crashed here       
} 

查看Udemy上的高级c++课程,讲师说你不能存储指向二进制文件的指针,因为当你试图读回它们时,在写入它们之前使用的指针(地址)将不会保留在列表中。因此,您必须保存数据,而不是指针