2016-07-25 12 views
1

I aus dem folgenden Beispielcode (kompiliert mit -std = C++ 11)write '3D' Vektor pod Typ Binärdatei C++

Es ist ein 3D-Vektor 10 * 20 * 30 mit der Zahl 8 gefüllt überall . Ich kann nicht herausfinden, wie man es auf die Festplatte schreibt und es zurück liest. Kann mir jemand sagen, wie bitte oder vervollständige ich die r-rw Routinen?

#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

Sie tun dies, indem Sie jeden Vektor jedes Vektors des * Vektors * einzeln nacheinander schreiben/lesen. Oder, Sie sichern all dies, verwenden Sie einfach einen 'std :: vector ' von Anfang an und machen Sie den tiefgestellten Mathe selbst, wo auch immer es verwendet wird. – WhozCraig

+0

Allgemeine Konvention ist, dass Sie 'auto const &' verwenden sollten, wenn Sie die Elemente nicht ändern. –

Antwort

1

Es ist nicht möglich, den gesamten Block in einen einzelnen Schreibsatz zu schreiben. Eine sehr einfache Lösung nach Ihren Code ist:

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

Auf der anderen Seite, wenn Sie sie lesen möchten, müssen Sie die Maße Ihrer Vektoren kennen; es ist ähnlich. Wenn nicht, müssten Sie diese Größen vor den Daten speichern.

1

Zwei verschachtelte Schleifen ist ein möglicher Weg, und dann schreiben z. &all8s[i][j][0] (das ist das gleiche wie all8s[i][j].data()). Beachten Sie, dass ich die Vektorindexierung als Beispiel verwende. Sie könnten Iteratoren oder die bereichsbasierte for-Schleife verwenden, die Sie bereits verwenden.

Lesen ist einfach, wenn Sie bereits die Größen kennen. Sie können entweder die Größen für die Kompilierung feste Größen haben, wie Sie für Ihr Beispiel haben all8s, oder Sie können die Größen (Dimensionen) in der Datei als Header vor den Daten speichern. Egal, wie Sie die Größen erhalten, müssen Sie dann die Vektoren resize lesen und lesen Sie es im Grunde die gleiche Weise, wie Sie es schreiben.


Oder benutzen Sie einfach eine serialization library die meisten Funktionen bereits eingebaut haben.