STL und speichern



  • Hallo zusammen

    ich habe nochmal eine STL Frage:

    Kann man die STL - Container auf eine schoene Weise abspeichern oder muss man wirklich jedes Element nacheinander in ein File schreiben? Gibt es Routinen die einen ganzen vector oder lists auf einmal abspeichern und die nachher auch wieder laden?

    Danke





  • Hier ein Beispiel, die benötigten Header musst du dir allerdings selber raussuchen.

    int main()
    {
    	vector< int > vec;
    	ofstream out( "bla.txt" );
    	for( int i = 0; i < 10; ++i )
    		vec.push_back( i );
    	copy( vec.begin(), vec.end(), ostream_iterator< int >( out, " " ) );
    
    	out.close();
    
    	ifstream in( "bla.txt" );
    
    	vector< int > newVec;
    
    	copy( istream_iterator< int >( in ), istream_iterator< int >(), back_inserter< vector< int > >( newVec ) );
    
    	cout << "Testausgabe: \n";
    	copy( newVec.begin(), newVec.end(), ostream_iterator< int >( cout, " " ) );
    }
    

    Wenn du Fragen zu den einzelnen Teilen hast helfe ich/wir dir gerne, aber am besten ist es du schaust dir einfach mal die STL und die C++-Streams genauer an, die beiden sind nämlich sehr mächtig, wie du hier siehst.



  • Sehe gerade, dass Hume das in der FAQ schon sehr schön erklärt hat 🙂



  • copy() mit einem ostream_iterator als Ziel:

    void speichere(list<int> values,char* filename)
    {
      ofstream fout(filename);
      copy(values.begin(),values.end(),ostream_iterator(fout,'\t');
    }
    

    (das klappt mit jedem STL-Container - und sogar mit deinen eigenen STL-ähnlichen Containern)



  • Dankeschoen zusammen. Hatte gar nicht mehr an die FAQ gedacht 🙄



  • Hmm leider funktioniert das mit dem ostream-iterator so nicht. Da ich eine eigene Klasse entworfen habe und mein vector Elemente dieser Klasse enthaelt bekomme ich die Fehlermeldung:

    error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const PointN' (or there is no acceptable conversion)

    Das heisst also fuer mich jetzt den iterator fuer meine PointN-Klasse zu ueberladen?



  • nein du musst einen op<< schreiben der für deine klasse

    struct Foo
    {
     string bla;
    };
    ostream& operator<<( ostream& out, Foo& obj )
    {
     out << bla;
     return out; //Muss zurückgegeben werden damit ne Verkettung möglich ist
                 //Also: cout << "bla" << 1 << Foo() << "12345" << endl;
    }
    


  • wenn ich das so versuche dann sagt er mir dass der binary operator<< zuviele Elemente besitzt



  • Kann ich jetzt nicht nachvollziehen, hab dir hier aber mal nen voll funktionsfähiges beispiel gemacht:

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct Foo
    {
    	Foo( const string& str )
    	{
    		s = str;
    	}
    	string s;
    };
    ostream& operator<<( ostream& out, Foo& obj )
    {
    	out << obj.s;
    	return out;
    }
    
    int main()
    {
    	Foo f( string("bla") );
    	cout << f;
    
    }
    

Anmelden zum Antworten