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

时间:2015-11-25 03:51:48

标签: c++ file stream binary

我正在尝试编写一个数据结构:

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

到二进制文件。

我使用ofstream写入二进制文件:

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();
        }
    }

但是,在读取二进制文件后,我无法遍历列表。它给了我一个例外,说&#34;列出了迭代器以外的范围&#34;。

第二个问题是,当我第二次尝试读取二进制文件时,&#34; pData&#34;不是我输入的内容。

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       
} 

1 个答案:

答案 0 :(得分:1)

检查Udemy上的高级c ++课程,教师说你不能存储指向二进制文件的指针,因为当你试图读回它们时,你在编写它们之前使用的指针(地址)仍然不会保留给列表。所以你必须保存数据而不是指针