IO (plattform unabhängig)
-
Hallo, ich habe folgendes Problem,
ich ziemlich oft arrays von double auslesen, und schreiben.
Zur Zeit mache ich das über streams als strings, das funktioniert auch gut,
macht aber keinen spass mehr, wenn die dateien ca 1GB gross werden.Kennt wer eine Seite wo man nachlesen kann, wie man am besten
double nach char* umwandelt, und umgekehrt, damit ich das ganze im
binär-format abspeichern kann?
Das würde nämlich jede Menge Ladezeit sparen.Danke im Vorraus.
Das Problem ist nur das sizeof(double) ständig schwankt, geringer datenverlust
würde mich nicht stören (zB 64bit double als 32bit abspeichern, und dann wieder als 32bit laden)
-
Kennt wer eine Seite wo man nachlesen kann, wie man am besten
double nach char* umwandelt, und umgekehrt, damit ich das ganze im
binär-format abspeichern kann?Versteh ich nicht. Du kannst jeden beliebigen Datentyp im Binärformat abspeichern, dazu bedarf es keiner Zeichenkette o.Ä..
Das Problem ist nur das sizeof(double) ständig schwankt, geringer datenverlust
würde mich nicht stören (zB 64bit double als 32bit abspeichern, und dann wieder als 32bit laden)Meinst du, die Größe eines doubles ändert sich auf einer anderen Platform? Das ist kein Problem. Entweder du bedienst dich an den platformunabhängigen Datentypen aus der Boost-Library, oder bastelst dir z.B. deinen platformunabhängigen Datentyp selber, wie hier als Beispiel näher gebracht (es handelt sich um einen Integer, lässt sich aber problemlos als Templateklasse implementieren):
#include <iostream> using namespace std; typedef unsigned char My32BitInteger[4]; class MyInteger { private: My32BitInteger myInt; public: // Konvertierungsoperator operator int(); // Standardkonstruktor MyInteger() { cout << "Standardkonstruktor" << endl; myInt[0] = 0; myInt[1] = 0; myInt[2] = 0; myInt[3] = 0; } // Konvertierungskonstruktor MyInteger( int i ) { cout << "Konvertierungskonstruktor" << endl; myInt[0] = *( reinterpret_cast <char*> (&i) ); myInt[1] = *( reinterpret_cast <char*> (&i)+1 ); myInt[2] = *( reinterpret_cast <char*> (&i)+2 ); myInt[3] = *( reinterpret_cast <char*> (&i)+3 ); } }; // Konvertierungsoperator MyInteger:: operator int() { cout << "Konvertierungsoperator " << endl; return *(reinterpret_cast <unsigned*> (myInt)); } int main() { // Konvertierungskonstruktor MyInteger my_int( 77777777 ); cout << my_int << endl; // Standardkonstruktor MyInteger my_integer; // Konvertierungsoperator int i = my_integer; cout << i << endl; my_integer = my_int; cout << my_integer << endl; getchar (); }In dem Beispiel ist der Integer also auf jeder Platform 32 Bit groß.
-
dann werde ich um boost wohl nicht rumkommen

ich weiss schon, das man sowas in etwa so schreiben würde, wie du es aufgezeigt hast, mein problem ist eher, das ich nicht genau weiss, wie ich die konvertierungsoperatoren schreiben soll, du machst ja auch die annahme das
sizeof(int) == 4
-
sizeof(double)???
-
ich werde wohl den traum von :
" schreibe double in bin-file auf 32bit-windows, und
lese die datei in 64bit-linux" verwerfen.Mir reichts eigentlich auch, wenn die dateien nur auf der selben
Platform lesbar sind.und dann geht das ja auch ziemlich einfach mit sizeof() und rumcasten.
-
Ein double sollte aber bei den meisten (heutigen) Compilern immer 8 Bytes entsprechen, d.h. das hat nichts mit der Prozessordatenbreite zu tun (32 oder 64 Bit).
-
ich werde wohl den traum von :
" schreibe double in bin-file auf 32bit-windows, und
lese die datei in 64bit-linux" verwerfen.Wieso verwerfen? Wozu halten sich wohl (sogut wie) alle an den IEEE 754 Standard?
Ist in C++ IEEE 754 nicht sogar vorgeschrieben (double und float)?