0

我有一个向量:

class Element
{
public:

    string pathName;
    ui64 offsitePtr;
    ui64 subPage;

public:

    Element(void);

    ~Element(void);
};

vector<Element> elem;

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

4

1 回答 1

0

只要您不Element直接从内存中写入向量或 s ,就可以了。您需要序列化任何不是 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) );
}

当你阅读时,你也会做类似的事情。将让您解决=)请注意,在每种情况下,您都在编写大小,然后是数据。当您阅读时,您会阅读大小,然后在将内容读入之前调整结构的大小。

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

于 2012-10-26T02:46:39.147 回答