.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 POD

    Die 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.


  • Mod

    Das ist sogar dann zulässig, wenn d kein POD ist.


  • Administrator

    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 ein std::ostream ist, dann erwartet write einen Zeiger auf char . An einen Zeiger auf char kann man auch nur Zeiger auf char übergeben. Das ist nicht wie bei einem void* (Zeiger auf void würde jetzt irgendwie seltsam klingen).

    Die C Funktion fwrite erwartet einen void* , die sollte man aber nicht mit der Funktion std::ostream::write verwechseln 😉

    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.


  • Mod

    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?


  • Administrator

    Hmmm, da fehlt wohl etwas Wissen.
    std::ostream und std::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 direkt write und read verwenden.
    Da ein char 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 von char angeschaut. sizeof(d) ergibt sehr wahrscheinlich 8. Somit werden die 8 Bytes, welche den double 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 von char 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


Log in to reply