Daten in Datei schreiben



  • hi
    mal wieder häng ich ... unzwar muss ich aus einem Array das mit einer struktur versehen ist in eine Datei schreiben. Bisher schreibt er zwar was in die Datei aber nur Buchstaben. Die Zahlen schreibt er als "{Ì œ ". Nun wollte ich fragen ob man mit der funktion fwrite() auch integer Werte schreiben kann.



  • hmm kann es sein das du im Moment deine Datei Binär geöffnet hast? 😉



  • Thelos, nein, fwrite kann nur chars schreiben. Wenn du Zahlen hast und die im 10er System und lesbar in der Datein stehen haben willst musst du fprintf oder was ähnliches verwenden.



  • bei c++ wohl eher nicht ... da öffnet meine stream halt nicht binary und streamt alles rein was man haben will sollte dann im klartext lesbar sein,.



  • (D)Evil schrieb:

    bei c++ wohl eher nicht ... da öffnet meine stream halt nicht binary und streamt alles rein was man haben will sollte dann im klartext lesbar sein,.

    Hier schreibt aber keiner was von Streams, ausser du eben 🙂
    :

    Thelos schrieb:

    hi
    mal wieder häng ich ... unzwar muss ich aus einem Array das mit einer struktur versehen ist in eine Datei schreiben. Bisher schreibt er zwar was in die Datei aber nur Buchstaben. Die Zahlen schreibt er als "{Ì œ ". Nun wollte ich fragen ob man mit der funktion fwrite() auch integer Werte schreiben kann.



  • jo ... und da wir hier in nem C++ Bereich sind ... sollte man auch auf C++ STL-Funktionen zurückgreifen ...



  • Hallo Thelos,

    für das Schreiben und Lesen von Daten, wie Du sie in Deinem ersten Thread beschreiben hast, schlage ich Dir folgendes vor:

    #include <fstream>
    #include <iostream>
    #include <iterator>
    #include <vector>
    
    std::istream& komma( std::istream& in )
    {
        char c;
        if( in >> c && c != ',' )
            in.setstate( std::ios_base::failbit );
        return in;
    }
    std::istream& semikolon( std::istream& in )
    {
        char c;
        if( in >> c && c != ';' )
            in.setstate( std::ios_base::failbit );
        return in;
    }
    
    struct Record
    {
        Record() : m_i1( 0 ), m_i2( 0 ), m_c( ' ' ), m_i3( 0 ), m_i4( 0 ) {}
        Record( int i1, int i2, char c, int i3, int i4 )
            : m_i1( i1 ), m_i2( i2 )
            , m_c( c )
            , m_i3( i3 ), m_i4( i4 )
        {}
        // --   schreiben
        friend std::ostream& operator<<( std::ostream& out, const Record& r )
        {
            return out << r.m_i1 << ',' << r.m_i2 << ',' << r.m_c 
                << ',' << r.m_i3 << ',' << r.m_i4 << ';';
        }
        // --   lesen
        friend std::istream& operator>>( std::istream& in, Record& r_ )
        {
            Record r;
            if( in >> r.m_i1 >> komma >> r.m_i2 >> komma >> r.m_c 
                >> komma >> r.m_i3 >> komma >> r.m_i4 >> semikolon )
                r_ = r;
            return in;
        }
        // --   members
        int m_i1, m_i2;
        char m_c;
        int m_i3, m_i4;
    };
    
    int main()
    { 
        using namespace std;
        vector< Record > v;
        {   // --   aus Datei lesen
            ifstream file( "input.txt" );
            vector< Record > v_( (istream_iterator< Record >( file )), istream_iterator< Record >() );
            swap( v, v_ );
        }
        cout << v.size() << " Eintraege gelesen" << endl;
        {   // --   Daten in Datei schreiben
            ofstream file( "output.txt" );
            copy( v.begin(), v.end(), ostream_iterator< Record >( file, "\n" ) );
        }
        return 0;
    }
    

    Gruß
    Werner



  • hustbaer schrieb:

    Thelos, nein, fwrite kann nur chars schreiben.

    Käse. fwrite() kann beliebige Daten schreiben (du übergibst ihm einen "void*" Zeiger). Allerdings schreibt es die Werte in binärer Darstellung (d.h aus einem "normalen" int-Wert macht es einen Block von 4 Zeichen). In Textdarstellung kannst du deine Daten per fprintf() bzw. dem Stream-Operator << ausgeben.


Anmelden zum Antworten