vector<bool> in eine Datei speichern?
-
Wieder ich und wieder eine Frage
Wie speicher ich am besten ein vector<bool> in einer Datei und zwar so, dass er 1 Bit pro bool verbraucht, wie es (hoffentlich) auch im vector<bool> passiert? Und nicht pro bool ein Byte?
Und wie lese ich das dann wieder ein?
-
-
Manchmal hat man echt das Gefühl, du willst nur möglichst oft deine beiden Lieblingslinks loswerden...
Ich würde es ungefähr so machen (ungetesteter Pseudocode):
uint32_t size = vec.size(); stream.write(&size, sizeof size); for (unsigned i = 0; i < vec.size(); i += 8) { uint8_t byte = 0; for (unsigned j = 0; j < 8 && i + j < vec.size(); ++j) if (vec[i + j]) byte |= 1 << j; stream.write(&byte, sizeof byte); }
Und das Laden dann entsprechend. Also über lustige Bitspielereien.
-
@kingruedi: Ich hab schon in der FAQ nachgeschaut!
Dort steht zum Vektorspeichern:// Das ist das ganze Speichern. Bei Fragen fragen copy(myVec.begin(),myVec.end(),ostream_iterator<int>(datei," "));
Leider ist für mich nicht ganz klar, in welcher Form der das dort Speichert, insbesondere weil dort ein "int"-iterator Verwendet wird. Das deutet für mich sehr stark auf 1 Bool = 1 Byte hin, da anscheinend jedes Element von myVec einem int zugeordnet wird. Und das will ich gerade nicht!
@operator void : So in etwa hab ich mir das auch gedacht, ich hab nur gehofft, da gibt es eine Abkürzung, dass er zum Beispiel immer gleich ein Byte auf einmal schreibt.
Was passiert bei folgendem:uint32_t size = vec.size(); stream.write(&vec, size/8); //Hier jetzt noch die restlichen Bit(weniger als 8)
Ich hoffe ihr wisst was ich meine...
-
Normaler Weise würde man bei einem vector<int> z.B. schreiben
stream.write(reinterpret_cast<char*>&vec[0], size_etc);
Das geht bei einem vector<bool> aber nicht, da vec[0] eine Instanz einer Hilfsklasse zurückgibt, die sich ungefähr wie bool& verhält. So wie ich das sehe, hat man also keine Chance, an den tatsächlichen Inhalt eines vector<bool>s zu kommen. Bleibt nur die manuelle Lösung.
-
Ich verstehe gerade nicht, was du mir sagen willst.
-
Nimda schrieb:
Ich verstehe gerade nicht, was du mir sagen willst.
Er will sagen, dass sich vector<bool> anders verhält als jeder andere vector, beispielsweise vector<int>.
Bei vector<bool> liefert der operator[] nämlich keine Referenz auf die tatsächlichen Daten zurück.
-
Aha. Und das bedeutet, man muss ihn auf die umständliche Weise speichern?
Schade...