写入和读取矢量到二进制文件

时间:2012-10-26 02:28:30

标签: c++

我有一个矢量:

class Element
{
public:

    string pathName;
    ui64 offsitePtr;
    ui64 subPage;

public:

    Element(void);

    ~Element(void);
};

vector<Element> elem;

elem的大小将控制在4096字节以下。在程序结束时,我应该fwrite elem进入二进制文件。我目前使用的解决方案是创建一个char缓冲区并在其中写入elem中的元素。我不认为这是个好主意。还有其他好的想法吗?

1 个答案:

答案 0 :(得分:0)

如果您不直接从内存中写入向量或Element,那没关系。您需要序列化任何非POD(普通旧数据)的内容。在您的情况下:vectorstring

向量很简单,因为你可以为Element创建一个函数。但是你可能想要序列化矢量大小:

ofstream& WriteVec( ofstream& s, vector<Element> &elem )
{
    size_t size = elem.size();
    s.write( (char*)&size, sizeof(size) );
    for( int i = 0; i < size; i++ )
        elem(i).Write(s);
    return s;
}

对于你的元素:

ofstream& Element::Write( ofstream& s )
{
    // Serialize pathName
    size_t strsize = pathName.size();
    s.write( (char*)&strsize, sizeof(strsize) );
    s.write( pathName.c_str(), strsize );

    // Serialize other stuff
    s.write( (char*)&offsitePtr, sizeof(offsitePtr) );
    s.write( (char*)&subPage, sizeof(subPage) );
}

当你阅读时,你会做类似的事情。会留下你的工作=)注意在每种情况下,你正在写一个大小,然后是数据。阅读时,您会读取大小,然后在将内容读入之前调整结构大小。

哦,确保以二进制模式打开文件流。