binäres lesen & schreiben in fstream?



  • Hallo,
    Ich möchte eine Liste von INTs in eine Datei schreiben. einfach ::operator<<(MyFStream,MyInt) für jedes int aufzurufen bringt es nicht, da ich beim Lesen später nicht unterscheiden kann, wann ein INT aufhört und ein neues beginnt (da die Datei später nur _eine_ lange Zahl enthält).
    Wie kann ich nun die INT binär schreiben/lesen, ohne fstream.write((char*)(&MyInt),sizeof(int)); / fstream.read(...) zu benutzen?



  • fstr schrieb:

    Hallo,
    Ich möchte eine Liste von INTs in eine Datei schreiben. einfach ::operator<<(MyFStream,MyInt) für jedes int aufzurufen bringt es nicht, da ich beim Lesen später nicht unterscheiden kann, wann ein INT aufhört und ein neues beginnt (da die Datei später nur _eine_ lange Zahl enthält).

    Wenn du die Werte später auftrennen können willst, müsstest du Trennzeichen (sehr beliebt sind Space oder '\t') zwischen deine Werte schreiben.

    Wie kann ich nun die INT binär schreiben/lesen, ohne fstream.write((char*)(&MyInt),sizeof(int)); / fstream.read(...) zu benutzen?

    Gar nicht - write()/read() sind der Weg, um Daten binär zu schreiben/lesen.



  • fstr schrieb:

    .. da ich beim Lesen später nicht unterscheiden kann, wann ein INT aufhört und ein neues beginnt

    wie CStoll schon sagte, müssen die ints mit Whitespace (Leerzeichen, Tabulator oder Zeilenende) getrennt werden, dann ist auch das wieder einlesen kein Problem. Hier ein Beispiel:

    #include <algorithm>    // copy
    #include <fstream>      // i/ofstream
    #include <iterator>     // i/ostream_iterator
    #include <iostream>     // cout, endl
    
    int main()
    {
        using namespace std;
        {
            // ints in Datei schreiben
            ofstream out( "int_list.txt" );
            for( int i = 0; i < 10; ++i )
                out << i*i << " ";      // mit Space (oder LF, oder Tab) trennen
        }
        // ints aus Datei lesen & anzeigen
        ifstream in( "int_list.txt" );
        copy( istream_iterator< int >( in ), istream_iterator< int >(), 
            ostream_iterator< int >( cout << "int-Liste: ", "; " ) );
        cout << endl;
        return 0;
    }
    

    binäres IO als Standardvorgehen ist nicht zu empfehlen. Allein schon deswegen, weil man das was man schreibt mit einem normalen Editor nicht mehr lesen kann.

    Gruß
    Werner



  • und weil es enorm fehleranfällig ist. Ein Schreibfehler weiter vorn und die ganze Datei wird nahezu unlesbar.
    Ich muß aber zugeben, dass ich es trotzdem manchmal mache. 😉



  • Ok, ich bleibe bei .write...

    Eine Frage noch:

    template<class T>FORCEINLINE void Schreibe(ostream*const pStream,const T& T_)
    {
    	pStream->write(reinterpret_cast<const char*>(&T_),sizeof(T));
    }
    
    Schreibe(&Datei,Ints.size());
    

    Wies bekomme ich die Warnung "Warning 8 warning C4267: 'argument' : conversion from 'size_t' to 'const unsigned int', possible loss of data"



  • Auf welches Argument bezieht sich denn diese Meldung?

    (btw, spätestens wenn du nicht-PODs ("echte" C++ Klassen) oder struct's mit Pointer-Elementen auf diese Weise speichern willst, wirst du ein Problem haben - das Schreiben (und spätere Einlesen) wird problemlos compiliert, aber mit den zurückgelesenen Variablen wirst du nur mit viel Glück noch etwas anfangen können)

    PS: Und tu dir selber einen Gefallen und übergib' den Stream per Referenz 😉



  • In der

    Schreibe(&Datei,Ints.size());
    

    -Zeile!


Anmelden zum Antworten