unsigned int mit Wert 10 wird als 5 byte geschrieben
-
Hallo zusammen,
ich möchte unsigned int in eine binäre Datei schreiben. Folgender Code als Beispiel:
int main() { unsigned int data0 = 8; unsigned int data1 = 9; unsigned int data2 = 10; unsigned int data3 = 11; std::ofstream file("test.bin", std::ios_base::out, std::ios_base::binary); file.write(reinterpret_cast<char*>(&data0), sizeof(data0)); file.write(reinterpret_cast<char*>(&data1), sizeof(data1)); file.write(reinterpret_cast<char*>(&data2), sizeof(data2)); file.write(reinterpret_cast<char*>(&data3), sizeof(data3)); file.close(); return 0; }
Als Ergebnis erhalte ich als hexdump folgendes:
08 00 00 00 09 00 00 00 0D 0A 00 00 00 0B 00 00 00 | 8 -> OK | 9 -> OK |??| 10 -> OK | 11 -> OK
Ich bin nun total verwirrt, was da vor der 10 los ist?
Vielen Dank und VG,
Jan
-
Oh Mann ...
std::ofstream file("test.bin", std::ios_base::out, std::ios_base::binary);
sollte
std::ofstream file("test.bin", std::ios_base::out | std::ios_base::binary);
sein.
So kann man auch 3 Tage verbringen ...
-
und der compiler gibt da keine warnung aus, wenn mal eben ein parameter mehr übergeben wird?
-
Es gibt den Konstruktor
fstream(const char* name, int mode, int prot =filebuf::openprot)
der darauf passt.@jan23
std::ios_base::out
kannst Du dir beistd::ofstream
schenken.
-
@swordfish sagte in unsigned int mit Wert 10 wird als 5 byte geschrieben:
Es gibt den Konstruktor
fstream(const char* name, int mode, int prot =filebuf::openprot)
der darauf passt.@jan23
std::ios_base::out
kannst Du dir beistd::ofstream
schenken.Ziemlich mies, dass mode und prot einfache ints und kein separaten Typen sind. In Java würde man ein enum dafür benutzen. Wie macht man das in C++ typsicher?
-
@rapper sagte in unsigned int mit Wert 10 wird als 5 byte geschrieben:
Wie macht man das in C++ typsicher?
enum class
-
@rapper sagte in unsigned int mit Wert 10 wird als 5 byte geschrieben:
@swordfish sagte in unsigned int mit Wert 10 wird als 5 byte geschrieben:
Es gibt den Konstruktor
fstream(const char* name, int mode, int prot =filebuf::openprot)
der darauf passt.@jan23
std::ios_base::out
kannst Du dir beistd::ofstream
schenken.Ziemlich mies, dass mode und prot einfache ints und kein separaten Typen sind. In Java würde man ein enum dafür benutzen. Wie macht man das in C++ typsicher?
mode ist kein enum, weil es eine Kombination binärer Werte sein kann. Sonst müsste man für jede erdenkliche Kombination einen enum Wert erstellen, was nicht wirklich im Sinne des Erfinders ist.
-
@dnkpp sagte in unsigned int mit Wert 10 wird als 5 byte geschrieben:
@rapper sagte in unsigned int mit Wert 10 wird als 5 byte geschrieben:
@swordfish sagte in unsigned int mit Wert 10 wird als 5 byte geschrieben:
Es gibt den Konstruktor
fstream(const char* name, int mode, int prot =filebuf::openprot)
der darauf passt.@jan23
std::ios_base::out
kannst Du dir beistd::ofstream
schenken.Ziemlich mies, dass mode und prot einfache ints und kein separaten Typen sind. In Java würde man ein enum dafür benutzen. Wie macht man das in C++ typsicher?
mode ist kein enum, weil es eine Kombination binärer Werte sein kann. Sonst müsste man für jede erdenkliche Kombination einen enum Wert erstellen, was nicht wirklich im Sinne des Erfinders ist.
Dann sollte man den Erfinder ohrfeigen.
-
@dnkpp sagte in unsigned int mit Wert 10 wird als 5 byte geschrieben:
Sonst müsste man für jede erdenkliche Kombination einen enum Wert erstellen, was nicht wirklich im Sinne des Erfinders ist.
Müsste man nicht. Man müsste bloss die nötigen Operatoren definieren.
-
@swordfish sagte in unsigned int mit Wert 10 wird als 5 byte geschrieben:
Es gibt den Konstruktor
fstream(const char* name, int mode, int prot =filebuf::openprot)
der darauf passt.@jan23
std::ios_base::out
kannst Du dir beistd::ofstream
schenken.Ich hatte mal vor langer Zeit eine Implementierung wo man entweder bei ifstream oder ofstream dieses Flag angeben musste, sonst ging es nicht korrekt.