簡體   English   中英

二進制讀/寫任意 std::vector <std::vector<int> &gt; 在 c++ </std::vector<int>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM