Vektor-Array in Datei speichern



  • Ich habe einen Vektor, der als Elemente wieder Vektoren beinhaltet. DIese sind jedoch unterschiedlich lang(!):

    [cpp]std::vector< std::vectory< int > > OverlordVector; 
    std::vector<int> minivector; 
    
    for (i = 0; i < 20000; i++) 
    { 
        minivector.push_back(i) 
    } 
    
    OverlordVector.push_back(minivector); [/cpp]
    

    Wie kann ich diesen (Overlord-)Vektor jetzt in ne Datei schreiben (ASCII oder Binary), und ihn später auch wieder leicht auslesen?

    ANGs_Pino



  • Wenn es als ASCII geschrieben werden darf, könntest Du z.B. die geschachtelten Vektoren immer in eine Zeile packen.



  • ANGs_Pino schrieb:

    Ich habe einen Vektor, der als Elemente wieder Vektoren beinhaltet. ...
    Wie kann ich diesen (Overlord-)Vektor jetzt in ne Datei schreiben (ASCII oder Binary), und ihn später auch wieder leicht auslesen?

    ASCII sollte zunächst die erste Wahl sein (weil viel einfacher)

    das geht z.B. so:

    #include <fstream>
    #include <algorithm>    // copy, swap
    #include <iterator>     // ostream_iterator
    #include <iostream>
    #include <vector>
    
    std::ostream& save( std::ostream& out, const std::vector< std::vector< int > >& v )
    {
        out << v.size() << std::endl;
        for( std::vector< std::vector< int > >::const_iterator i = v.begin(); i != v.end(); ++i )
        {
            out << i->size() << std::endl;
            std::copy( i->begin(), i->end(), std::ostream_iterator< int >( out, " " ) );
            out << std::endl;
        }
        return out;
    }
    std::istream& load( std::istream& in, std::vector< std::vector< int > >& v_ )
    {
        std::vector< std::vector< int > > v;
        std::size_t n;
        in >> n; // Anzahl der vector<int>
        for( std::size_t m; n && in >> m; --n )
        {
            std::vector< int > mini;
            for( int x; m && in >> x; --m )
                mini.push_back( x );
            v.push_back( mini ); // oder: v.push_back( std::vector< int >() ); swap( v.back(), mini );
        }
        if( in ) // Lesen war ok ...
            swap( v_, v ); // .. dann übernehmen
        return in;
    }
    
    int main()
    {
        using namespace std;
        std::vector< std::vector< int > > OverlordVector;
        // OverlordVector füllen ...
        {   // --   Speichern
            ofstream output("overlord.txt");
            if( save( output, OverlordVector ) )
                cout << "korrekt gespeichert " << endl;
        }
    
        // --   Laden
        ifstream input("overlord.txt");
        if( load( cin, OverlordVector ) )
            cout << "Gelesen .. " << OverlordVector.size() << " Vektoren" << endl;
        return 0;
    }
    


  • Werner_logoff schrieb:

    if( load( cin, OverlordVector ) )  // Zeile 48
    

    .. muss natürlich

    if( load( input, OverlordVector ) )
    

    heißen.


Anmelden zum Antworten