二进制读/写任意std :: vector <std :: vector <int>&gt;在c ++中</std :: vector <int>

时间:2011-05-27 12:36:05

标签: c++ vector binary-data

您好, 我想将二进制文件std::vector<std::vector<int> >对象MATRIX存储在一个文件中。

out.write((char*)&MATRIX, sizeof(MATRIX));

问题是,只有列维度是固定的。行尺寸会发生变化。 如果我从二进制文件中读取对象,仅仅知道大小是不够的,不是吗?所以,初始化例如

的第二个矩阵
std::vector<std::vector<int> > MATRIX2;
for ( int i=0;i<column_dim;i++ ) MATRIX2.push_back ( vector<int> ( 0 ) );
ifstream in(cstr, ios::in | ios::binary);

并使用

读取对象数据
ifstream in(cstr, ios::in | ios::binary);    
in.read((char*)& MATRIX2, fSize);

没有意义,因为编译器对保存数据的结构没有任何线索。 我的问题: 有没有更好的方法来解决这个问题,而不是在第二个文件中保存矩阵结构(关于行维度的所有信息),读取它并创建具有适当结构的MATRIX2,然后使用

填充
ifstream in(cstr, ios::in | ios::binary);    
in.read((char*)&nn_H_test, fSize);

3 个答案:

答案 0 :(得分:3)

我将举例说明如何使用boost执行此操作。

#include <iostream>
#include <fstream>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

std::vector<std::vector<int > > g_matrix;
int main(int argc, char* argv[])
{
    // fill the vector
    std::ofstream ofs("c:\\dump");
    boost::archive::text_oarchive to(ofs);
    to << g_matrix;

    g_matrix.clear();
    std::ifstream ifs("c:\\dump");
    boost::archive::text_iarchive infs(ifs);
    infs >> g_matrix;
    // check your vector. It should be the same
}

如果你需要它更具人性化,你也可以尝试从boost中取出xml 一如既往不重新发明轮子。

答案 1 :(得分:2)

ios :: binary是almost certainly NOT going to have the result you think it will have - 它只影响行结尾翻译。

其次,如果你想在阅读时恢复结构,你不会逃避必须存储内部向量的各个长度。将一个原始的std :: vector从流直接恢复到一个新的std :: vector,就像你现在尝试的那样,无论如何都不会起作用。

然而,结构化恢复并不困难,只需为每个内部向量存储值的数量,然后存储所有值。然后,您的读取例程可以安全地读取第一个值,然后读取N个下一个值,并假设之后的第一个值是下一行的值的数量。

答案 2 :(得分:0)

对于非常简单的事情,为什么不在标记行列大小的矩阵输出之前放置标题值?琐碎的例子:

4,2 //#rows, #columns
0 1
2 0
2 3
4 5

现在读入矩阵时,请读入标题信息,然后读取矩阵数据。

如果希望矩阵可序列化,则应该查看矩阵结构的序列化范例。阅读C++ FAQ中有关序列化的更多信息。