![](/img/trans.png)
[英]Adding a member to std::vector<std::vector<int>> class in C++
[英]binary read/write arbitrary std::vector<std::vector<int> > in c++
嗨,我想在文件中存儲二進制std::vector<std::vector<int> >
object MATRIX。
out.write((char*)&MATRIX, sizeof(MATRIX));
問題是,只有列維度是固定的。 行維度發生變化。 如果我從二進制文件中讀取 object,僅僅知道大小是不夠的,不是嗎? 因此,初始化例如第二個矩陣
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);
並讀取 object 數據
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做到這一點。
#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。
一如既往,不要重新發明輪子。
ios::binary 幾乎肯定不會有你認為的結果——它只會影響行尾翻譯。
其次,如果你想在讀取時恢復結構,你不會逃避必須存儲內部向量的各個長度。 從 stream 直接將原始 std::vector 恢復到新的 std::vector 中,就像您現在嘗試的那樣,永遠不會奏效。
然而,結構化恢復並不難,只需為每個內部向量存儲值的數量,然后存儲所有值。 然后,您的讀取例程可以安全地讀取第一個值,然后讀取 N 個下一個值,並假設之后的第一個值是下一行的值的數量。
對於一些非常簡單的事情,為什么不在指定行列大小的矩陣 output 之前放置一個 header 值? 簡單的例子:
4,2 //#rows, #columns
0 1
2 0
2 3
4 5
現在當你讀入矩陣時,讀入 header 信息,然后讀入矩陣數據。
如果您希望矩陣可序列化,您應該查看矩陣結構的序列化范例。 在C++ 常見問題解答中閱讀有關序列化的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.