Ich serialisiere mehrere Objekte mit Boost in ein Binärarchiv.
Können Sie beim Zurücklesen dieser Objekte aus binary_iarchive
wissen, wie viele Objekte sich im Archiv befinden oder einfach nur das Ende des Archivs erkennen?
Der einzige Weg, den ich gefunden habe, ist ein try-catch, um die Stream-Ausnahme zu erkennen. Vielen Dank im Voraus.
Ich kann mir eine Reihe von Ansätzen vorstellen:
Serialisieren Sie STL-Container zu / von Ihrem Archiv (siehe Dokumentation ). Das Archiv wird automatisch verfolgen, wie viele Objekte sich in den Containern befinden.
Serialisieren Sie eine Zählvariable, bevor Sie Ihre Objekte serialisieren. Wenn Sie Ihre Objekte zurücklesen, wissen Sie im Voraus, wie viele Objekte Sie zurücklesen möchten.
Sie könnten das letzte Objekt mit einem speziellen Wert versehen, der als eine Art Sentinel fungiert, die das Ende der Liste der Objekte angibt. Vielleicht könnten Sie dem Objekt eine isLast
-Memberfunktion hinzufügen.
Das ist nicht sehr hübsch, aber Sie könnten eine separate "Indexdatei" neben Ihrem Archiv haben, die die Anzahl der Objekte im Archiv speichert.
Verwenden Sie die Position tellp
des zugrunde liegenden Stream-Objekts, um festzustellen, ob Sie sich am Ende der Datei befinden:
Beispiel (nur eine Skizze, nicht getestet):
%Vor%Dies funktioniert möglicherweise nicht mit XML-Archiven.
Haben Sie alle Ihre Objekte, wenn Sie mit der Serialisierung beginnen? Wenn nicht, "missbrauchen" Sie die Boost-Serialisierung - es ist nicht so gemeint. Allerdings benutze ich es so, indem ich try catch
benutze, um das Ende der Datei zu finden, und es funktioniert für mich. Verstecken Sie es einfach irgendwo in der Implementierung. Aber Vorsicht, wenn Sie es auf diese Weise verwenden, müssen Sie entweder Zeiger nicht serialisieren oder Zeigerverfolgung deaktivieren.
Wenn Sie bereits alle Objekte haben, sehen Sie sich die Antwort von Emile an. Sie sind alle gültige Ansätze.
Sie haben gerade ein Byte aus der Datei gelesen.
Wenn Sie das Ende nicht erreichen,
backword ein Byte dann.
Tags und Links boost eof boost-serialization