【问题标题】:Writing and reading vector into binary files将向量写入和读取二进制文件
【发布时间】:2012-10-26 02:28:30
【问题描述】:

我有一个向量:

class Element
{
public:

    string pathName;
    ui64 offsitePtr;
    ui64 subPage;

public:

    Element(void);

    ~Element(void);
};

vector<Element> elem;

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

【问题讨论】:

  • 请在您的代码中额外添加 4 个缩进标签,以便其格式正确。
  • 显示与问题相关的代码(即fwrite 调用),并清楚说明问题所在。
  • 其他代码是有用的,唯一困扰我的问题是如何将向量中的字符串和无符号长长数据写入二进制文件并快速读取。我将一次读取 4096 个字节。
  • fread 无论如何都在缓冲,所以我看不到读取 4096 字节块的速度有很大提高。您应该只阅读您需要的内容,除非您使用此块大小有其他原因。
  • 我正在写一个b-树索引。我应该从办公桌上读一页。页面大小为 4096 字节。所以,我应该读取 4096 个字节一次

标签: c++


【解决方案1】:

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

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

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

【讨论】:

  • char buff[4096] = {0};\n int j = 0;\n ui32 i = 1;\n for (i = 1; i countOfElements + 1; i++ )\n {\n memcpy(&buff[j], &pageToWrite->elementInNode[i].pathName, pageToWrite->elementInNode[i].pathName.size());\n j += pageToWrite->elementInNode[i]. pathName.size();\n memcpy(&buff[j], &pageToWrite->elementInNode[i].offsitePtr, 8);\n j += 8;\n memcpy(&buff[j], &pageToWrite->elementInNode[i] .subPage, 8);\n j += 8;\n }\n
  • 对不起,我按错了按钮。你的回答对我有用。不知道怎么在评论里写代码,不好意思……
  • 如果你想先读/写缓冲区,只需将我所有的ofstream::write 调用转换为memcpy 和指针运算(类似于读取)。您可以创建一个简单的Page 类来处理它,然后在其上创建方法以在磁盘上读/写它。您应该使用无缓冲 IO readwrite 而不是 freadfwrite 以获得更好的吞吐量。
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多