double in einen Stream schreiben ...
-
Hi, seit Jahren fülle ich meine Dateien so:
ofstream ofs("Test.dat"); double d=500; ofs.write(d,sizeof(double));hat immer geklappt, bis ich auf den gcc 3.2 umgestiegen bin, der sagt mir:
test.cpp:60: no matching function for call to `std::basic_ofstream<char,
std::char_traits<char> >::write(double&, unsigned int)'
/usr/include/g++/bits/ostream.tcc:387: candidates are:
std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
_Traits>::write(const _CharT*, int) [with _CharT = char, _Traits =
std::char_traits<char>]Dazu zwei Fragen:
1. Was soll das? Wieso klappt das nicht mehr?
2. Wie kriege ich es wieder hin?Danke!
-
Hi, seit Jahren fülle ich meine Dateien so
Das würde mich sehr wundern

ostream::write erwartet als erstes Argument einen Zeiger auf char (weil ostream == basic_ostream<char>). Also kannst du da schon gar keinen double übergeben. Mit etwas Augenzwinkern könnte man &d, also einen Zeiger auf double durchgehen lassen. Allerdings läßt das Typsystem das nicht zu. Lösung: reinterpret_cast<char*>(&d) oder C-Style-Cast.
-
Ok, eigentlich so:
ofstream ofs("Test.dat"); double d=500; ofs.write(&d,sizeof(double));Das ging aber bei älteren gcc's ohne Probleme durch ... gab nicht mal eine Warnung.
-
Die älteren GCCs (vor 3.0) waren bei weitem nicht standardkonform, und haben u.a. eine ältere, nicht konforme Implementierung der IOStreams-Library. Die Klasse ostream hat dort mehrere write-Memberfunktionen, und eine davon übernimmt einen void-Pointer.
Ab 3.0 ist ostream, wie vom Standard gefordert, ein typedef auf basic_ostream<char>, und hat auch nur noch eine write-Funktion, deren erstes Argument eben ein const char * sein muss.