.write()
-
Hallo,
kann mir bitte jemand diese Zeile erklären:ziel.write(reinterpret_cast<const char*>(&d), sizeof(d));
Write muss doch eigentlich nur ein Zeiger Übergeben werden, der auf den Anfang zeigt, von dem, was geschrieben werden soll, oder etwa nicht?
-
Ich nehme an, ziel ist ein std::ostream.
Ich nehme an, d ist ein PODDie Zeile bewirkt, dass die rohen Bytes, die den Wert von d ausmachen, direkt in den ostream geschrieben werden.
Das ist, falls d wirklich ein POD ist, zwar erlaubt, führt aber nicht zu einem plattformunabhängigen Dateiformat.
-
Das ist sogar dann zulässig, wenn d kein POD ist.
-
Marko N. schrieb:
Write muss doch eigentlich nur ein Zeiger Übergeben werden, der auf den Anfang zeigt, von dem, was geschrieben werden soll, oder etwa nicht?
Falls, wie krümelkacker es angemerkt hat,
ziel
einstd::ostream
ist, dann erwartetwrite
einen Zeiger aufchar
. An einen Zeiger aufchar
kann man auch nur Zeiger aufchar
übergeben. Das ist nicht wie bei einemvoid*
(Zeiger aufvoid
würde jetzt irgendwie seltsam klingen).Die C Funktion
fwrite
erwartet einenvoid*
, die sollte man aber nicht mit der Funktionstd::ostream::write
verwechselnhttp://www.cplusplus.com/reference/iostream/ostream/write/
http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/Grüssli
-
camper schrieb:
Das ist sogar dann zulässig, wenn d kein POD ist.
Zulässig, aber wenig sinnvoll. Das hättest Du auch noch sagen können.
-
krümelkacker schrieb:
camper schrieb:
Das ist sogar dann zulässig, wenn d kein POD ist.
Zulässig, aber wenig sinnvoll. Das hättest Du auch noch sagen können.
Hätte ich. Ist aber nur bedingt Gegenstand der Frage. Außerdem bedarf es einer Begründung. Beispielsweise könnte ich mir das gut für ein Debug-Log vorstellen.
-
Also mit dem stream hattet ihr recht. D ist eine double variable gewesen. Nun noch was zum lesen:
quelle.read(reinterpret_cast<char*>(&matrix), sizeof(matrix));
Matrix ist eine double matrix. Aber wieso muss ich hie auch in einen char pointer umwandeln? Wo wird denn hier die Konvertierung in double vorgenommen?
-
Hmmm, da fehlt wohl etwas Wissen.
std::ostream
undstd::istream
sind vor allem für Text Ein/Ausgaben gut. Dazu nimmt man ja meistens auch die Stream-Operatoren (<<, >>). Falls man keine Formatierung möchte, was bei den Stream-Operatoren automatisch passiert, so kann man direktwrite
undread
verwenden.
Da einchar
meistens auch genau einem Byte entspricht, werden diese Streams oft auch für binäres Schreiben und Lesen verwendet. Und genau das passiert in deinem Fall:ziel.write(reinterpret_cast<char*>(&d), sizeof(d));
Hier wird der
double d
als ein Array vonchar
angeschaut.sizeof(d)
ergibt sehr wahrscheinlich 8. Somit werden die 8 Bytes, welche dendouble
repräsentieren, in die Datei geschrieben.Beim umkehrten Fall:
file.read(reinterpret_cast<char*>(&d), sizeof(d));
Hier wird der
double d
wieder als Array vonchar
interpretiert. In dieses Array werden nun die Bytes reingeschrieben. Wenn es die gleiche Plattform ist (Endianess übereinstimmt), dann hast du am Ende im Speicher des doubles die gleichen Bytes, wie zu dem Zeitpunkt, wo du sie in die Datei geschrieben hast.Wichtig ist wohl auch zu verstehen, dass hier einfach die Speicherstelle wo der
double
Wert liegt, uminterpretiert wird. Genau dies sagt ja eigentlich auch der Cast aus: reinterpret.Grüssli