Wie schreibt man eine Objekt-Datei in C++
Ich habe ein Objekt mit mehreren text-strings als Mitglieder. Ich schreiben wollen, dieses Objekt in die Datei alle auf einmal, statt zu schreiben jeder string in Datei. Wie kann ich das tun?
InformationsquelleAutor neuromancer | 2010-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie überschreiben
operator>>
undoperator<<
lese - /Schreibzugriff zu streamen.Beispiel
Entry struct
mit einige Werte:Umsetzung:
Dann öffnen Sie das filestream -, und für jedes Objekt, das Sie nennen:
Oder Ausgang:
Oder, wenn Sie wollen, verwenden Sie die Streaming -
read
undwrite
dann ersetzen Sie einfach den relevanten code inoperator
s Umsetzung.Wenn die Variablen private in Ihrem struct/Klasse sind, dann müssen Sie erklären
operator
s als friend-Methoden.Implementieren Sie ein beliebiges format/Trennzeichen, die Sie mögen. Wenn die Zeichenfolge Leerzeichen enthalten verwenden Sie getline (), die einen string-stream statt
>>
weiloperator>>
verwendet Leerzeichen als Trennzeichen standardmäßig. Hängt von deinem Trennzeichen.InformationsquelleAutor stefanB
Es heißt Serialisierung. Es gibt viele Serialisierung threads auf DAMIT.
Gibt es auch eine schöne Serialisierungs-Bibliothek, die in boost.
http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/index.html
im Grunde können Sie tun
und
boost-Serialisierung.
InformationsquelleAutor Chris H
Wenn Sie haben:
dann können Sie es schreiben alle nur mit write(fh, ptr, sizeof(struct a)).
Natürlich, das ist nicht tragbar (weil wir nicht speichern die endieness oder die Größe von "int", " aber das kann nicht ein Problem für Sie.
Wenn Sie haben:
dann bist du nicht auf der Suche nach schreiben des Objekts; Sie schauen, um es zu serialisieren. Ihre beste Wette ist zu suchen in der Steigern Bibliotheken und Ihre Serialisierungs-Routinen, weil es nicht so ein einfaches problem in Sprachen ohne Reflexion.
InformationsquelleAutor user205666
Es ist nicht wirklich eine einfache Möglichkeit, C++, nachdem alle, nicht PHP oder JavaScript.
http://www.parashift.com/c++-faq-lite/serialization.html
Boost hat auch einige Bibliothek: http://www.boost.org/doc/libs/release/libs/serialization ... wie Tronic schon erwähnt 🙂
InformationsquelleAutor KiNgMaR
Die bessere Methode ist das schreiben jedes Feld einzeln zusammen mit der string-Länge.
Als alternative können Sie erstellen eine
char
array (oderstd::vector<char>
) und schreiben Sie alle Mitglieder in den Puffer schreiben Sie dann den Puffer an den Ausgang.Die zugrunde liegende Dorn ist, dass ein compiler darf insert Polsterung zwischen den Mitgliedern in einer Klasse oder Struktur. Verwenden
memcpy
oderstd::copy
Folge padding-bytes ausgegeben.Nur daran erinnern, dass Sie brauchen, um entweder schreiben die string-Längen und-Inhalte oder der Inhalte, gefolgt von einigen Endzeichen.
Andere Leute vorschlagen, Check-out der Boost Serialization library.
InformationsquelleAutor Thomas Matthews
Leider, das ist meist nicht ganz möglich. Wenn deine struct enthält nur die reinen Daten (keine Zeiger oder komplexe Objekte), können Sie speichern Sie es als ein Stück, aber Vorsicht muß genommen werden, wenn Portabilität ist ein Problem. Polsterung, Datentyp, Größe und endian Typ Probleme machen mit diesem Problem.
Können Sie die Verwendung von Boost.Serialisierung zu minimieren, die Menge an code erforderlich für die ordnungsgemäße tragbare und versionable searialization.
InformationsquelleAutor Tronic
Vorausgesetzt, Ihr Ziel ist es, wie gesagt, zu schreiben, die das Objekt mit einem einzelnen Aufruf von write() oder fwrite() oder was auch immer, Sie würden zuerst müssen, kopieren Sie die Zeichenfolge-und andere Objekt-Daten in einem einzigen, zusammenhängenden block im Speicher. Dann könnte man auch schreiben() , Speicherblock, der mit einem einzigen Anruf. Oder Sie könnten in der Lage sein zu tun, ein Vektor-schreiben durch den Aufruf writev(), wenn dieser Aufruf steht auf Ihrer Plattform.
Dieser sagte, werden Sie wahrscheinlich nicht viel zu gewinnen durch die Reduzierung der Anzahl der write-Aufrufe. Vor allem, wenn Sie mit fwrite() oder so ähnlich schon, dann die C-Bibliothek ist bereits dabei, die Pufferung für Sie, so dass die Kosten von mehreren kleinen fordert, ist sowieso minimal. Setzen Sie sich nicht durch eine Menge von zusätzlichen Schmerzen und die Komplexität des Codes, es sei denn, es wird tatsächlich etwas gutes tun...
InformationsquelleAutor Jeremy Friesner