2016-07-25 64 views
1

我提出了以下示例代碼(與-std編譯= C++ 11)寫入「3D」矢量莢類型爲二進制文件C++

它是填充有編號8到處一個三維矢量10 * 20 * 30 。 我不知道如何將其寫入磁盤並將其讀回。有人能告訴我如何請或完成r-rw例程嗎?

#include <iostream> 
#include <vector> 
#include <fstream> 

int main(int argc, char *argv[]) 
{ 
    //'3d' vector filled with 8's 
    std::vector<std::vector<std::vector<int>>> all8s (10,std::vector<std::vector<int>>(20,std::vector <int>(30,8)));; 
    //print the whole 
    std::cout << "1st size " << all8s.size() << " \n"; 
    for (auto& elemTop : all8s) { 
     std::cout << "2nd size " << elemTop.size() << " \n"; 
     for (auto& elemMiddle : elemTop) { 
      std::cout << "3th size " << elemMiddle.size() << " \n"; 
      for (auto& elemBottom : elemMiddle){ 
       std::cout << elemBottom << ","; 
      } 
      std::cout << "\n"; 
     } 
    } 

    //write binary file 
    std::ofstream out("all8s.bin", std::ios::out | std::ios::binary); 
    //how do I write this to disk 
    out.close(); 

    //read it? 
    std::vector<std::vector<std::vector<int>>> all8sReloaded; 
    std::ifstream in("all8s.bin", std::ios::in | std::ios::binary); 
    //how to read it back? 
    in.close(); 
} 
+1

您可以通過每次寫入/讀取* vector向量的每個向量來做到這一點。或者,你可以保留所有這些,從一開始就使用'std :: vector ',並自己對所使用的下標數學運算。 – WhozCraig

+0

常用約定是,如果不修改元素,則應該使用'auto const&'。 –

回答

1

無法在單個寫入句子中寫入所有塊。根據你的代碼,一個很簡單的解決方法是:

for (auto& elemTop : all8s) 
     for (auto& elemMiddle : elemTop) 
      for (auto& elemBottom : elemMiddle) 
       cout.write (reinterpret_cast(const char*)&elemBottom, sizeof(int)); 

在另一方面,如果你想閱讀它們,你需要知道你的向量的尺寸;它是相似的。如果不是,您將不得不在數據前保存這些尺寸。

1

兩個嵌套循環是一種可能的方式,然後寫入例如&all8s[i][j][0](與all8s[i][j].data()相同)。請注意,我使用向量索引作爲示例,您可以使用迭代器或基於範圍的for循環,就像您已經使用的那樣。

如果您已經知道尺寸,閱讀起來很簡單。您可以使用編譯時固定大小,例如all8s,或者可以在數據之前將大小(維)作爲頭保存在文件中。不管你如何得到尺寸,你都需要resize這些矢量,並且基本上和你寫的一樣。


或者只是使用一個serialization library其中大部分功能已經內置。