【发布时间】:2011-05-27 12:36:05
【问题描述】:
嗨,
我想将二进制 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);
?
【问题讨论】:
-
文件格式是否给定?如果不是,也许你想看看boost.org/doc/libs/1_46_1/libs/serialization/doc/index.html。这应该使您可以很容易地存储和加载 int 矩阵。
-
扩展我在stackoverflow.com/questions/3438132/…中建议的协议,在每个存储的矩阵前多加一个size_t来指定第一个维度。
-
哎呀,您是否要转储文件中的原始
std::vector?这将永远起作用,并且读回来你会得到一个处于完全混乱状态的对象(唯一正确的可能是向量大小,但指向元素的内部指针将是无效的) .您需要适当的序列化。 -
“那永远行不通”不是真的。如果我生成一个与 MATRIX 具有相同结构的 MATRIX2 对象,则所有内容都会以正确的顺序复制。
-
你很幸运,一般来说,像这样将 std::vector 转储到文件会导致转储其私有成员,通常是向量大小、向量容量和 指针 到它使用的内存。因此,如果您在同一执行过程中转储并重新加载它,它可能会起作用,但如果您尝试在新进程中加载它,则会以无效的内部指针结束。
标签: c++ vector binary-data