2017-12-06 2 views
-2

Ich versuche gerade, einen Vektor von Strukturen in eine Binärdatei zu schreiben und zu schreiben, so dass ich nicht damit verbringe, sie vorzufüllen, indem ich sie ständig auffülle.Wie liest und schreibt man einen Vektor von struct in eine Datei?

Ich habe anscheinend ein paar Probleme damit ... Ich dachte, ich könnte std::ofstream, aber das scheint nicht der Fall zu sein.

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

struct element 
{ 
    std::vector<std::pair<int, int>> coord; 
    element(std::vector<std::pair<int, int>> set_coord) 
    { 
     coord = set_coord; 
    } 
}; 

int main() 
{ 
    std::cout << "Hello, Wandbox!" << std::endl; 
    std::vector<element> matrix; 

    std::ofstream datafile; 
    datafile.open("path/to/file"); 
    datafile<<matrix; 
    datafile.close(); 
} 

https://wandbox.org/permlink/urCHoETdh7vE3xlE

Ich erhalte eine Fehlermeldung, dass die operator<< hier nicht gültig ist ... aber warum?

+0

Bei einem Push, würde ich sagen, es ist, weil Sie es nicht implementiert haben. was Sie nachschlagen möchten, ist Operator überladen – UKMonkey

+0

Weil es nicht gültig ist. Die eigentliche Nachricht, keine Umschreibung, ist 'prog.cc:25:13: Fehler: keine Übereinstimmung für 'Operator <<' (Operandentypen sind 'std :: ofstream' {aka 'std :: basic_ofstream '} und ' std :: vector ') ', und das ist vollkommen richtig und klar; Für diese Operandentypen ist kein Operator definiert. Ich meine, du dachtest, du könntest einfach alles einem "Ofstream" zuführen, und es würde irgendwie von Natur aus wissen, wie man es für die Ausgabe formatiert und in welcher spezifischen Art und Weise du willst? –

+0

Ich habe eine kleine Änderung gemacht, von zwei Ints zu einem Vektor von Paaren ... Es ist nicht möglich, es zu speichern, ohne eine Routine zu definieren, die die Datenstruktur zu ihrem Kern (ints) seziert und Ints einzeln speichert? – lamda

Antwort

1

Wenn Sie den Stream Operator verwenden möchten direkt müssen Sie es für Ihre Struktur überlasten. So etwas wie das:

#include <iostream> 
#include <vector> 

struct MyStruct { 
    using coordinates = std::vector<std::pair<int, int>>; 
    MyStruct(coordinates c) : c(c) {}; 

    friend std::ostream& operator<<(std::ostream& os, const MyStruct& m) { 
     for (const auto &pair : m.c) { 
      os << "First: " << pair.first << "; Second: " << pair.second; 
     } 
     return os; 
    } 

private: 
    coordinates c; 
}; 

class MyVector { 
public: 
    MyVector(std::initializer_list<MyStruct> list) : elements(list) {} 

    friend std::ostream& operator<<(std::ostream& os, const MyVector& m) { 
     for (const auto &ms : m.elements) { 
      os << ms << std::endl; 
     } 
     return os; 
    } 

private: 
    std::vector<MyStruct> elements; 
}; 

int main() 
{ 
    MyStruct m1({{1, 2}}); 
    MyStruct m2({{3, 4}}); 
    MyVector vec({m1, m2}); 
    std::cout << vec << std::endl; 
    return 0; 
} 

Ich habe den Code bearbeitet, so dass es mit einem Vektor als Mitglied funktioniert. Und in einem zweiten Montage ich meine eigene (sehr einfach) Vektor-Implementierung mit

Here wird den Code auf wandbox

+1

Nicht nur struct; aber auch Vektor. – UKMonkey

+0

@UKMonkey Gerade jetzt realisiert er will einen ganzen Vektor ausgeben. Ich habe meinen Code so geändert, dass dies auf sehr einfache Weise möglich ist. –

+0

Dies beantwortet nicht die Frage, die eindeutig 'binäre Datei' angibt. –

Verwandte Themen