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.


Anmelden zum Antworten