.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,
zieleinstd::ostreamist, dann erwartetwriteeinen Zeiger aufchar. An einen Zeiger aufcharkann man auch nur Zeiger aufcharübergeben. Das ist nicht wie bei einemvoid*(Zeiger aufvoidwürde jetzt irgendwie seltsam klingen).Die C Funktion
fwriteerwartet einenvoid*, die sollte man aber nicht mit der Funktionstd::ostream::writeverwechseln
http://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::ostreamundstd::istreamsind 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 direktwriteundreadverwenden.
Da eincharmeistens 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 dals ein Array voncharangeschaut.sizeof(d)ergibt sehr wahrscheinlich 8. Somit werden die 8 Bytes, welche dendoublerepräsentieren, in die Datei geschrieben.Beim umkehrten Fall:
file.read(reinterpret_cast<char*>(&d), sizeof(d));Hier wird der
double dwieder als Array voncharinterpretiert. 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
doubleWert liegt, uminterpretiert wird. Genau dies sagt ja eigentlich auch der Cast aus: reinterpret.Grüssli