Wie kann ich einen STL-Container abspeichern und später wieder laden?



  • Hi,

    ich bin grade dabei einen Leveleditor zu coden fürn 2D game, funzt super! Doch jetzt will ich meine Daten abspeichern!

    Ich benutze Vectoren, Maps und Lists. Wie kann ich die abspeichern in eine TXT?

    Ich möchte es gerne mit FILE aus C gerne tun, da ich mich mit den streams aus C++ nicht auskenne!

    Hat jemand ne Idee wie man die Daten speichert und wieder läd?

    Schon mal dickes Danke im voraus! 🙄

    Gruß,
    Ikari



  • Dir wird (denke ich) nichts anderes Übrig bleiben als über die maps list etc. mit einen Itrator zu wandern und jedes Element einzeln zu sichen.



  • naja der nachteil ist ich hab sowas vorher noch nie gemacht, hat jemand ein beispiel dafür?



  • Original erstellt von Knuddlbaer:
    Dir wird (denke ich) nichts anderes Übrig bleiben als über die maps list etc. mit einen Itrator zu wandern und jedes Element einzeln zu sichen.

    Vectoren kannst du am Stück abspeichern die anderen musst du einzeln abspeichern



  • #include <map>
    #include <list>
    #include <fstream>
    #include <iostream>
    #include <string>
    
    #pragma argsused
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        map<string,int> mymap;
        list<string> mylist;
    
        // Datei öffnen
        ofstream file ("Erg.txt");
    
        // Ein paar Werte anlegen
        mymap.insert(make_pair("Zeile1",1));
        mymap.insert(make_pair("Zeile2",1));
        mymap.insert(make_pair("Zeile3",1));
        mymap.insert(make_pair("Zeile4",1));
    
        mylist.push_back("ListItem1");
        mylist.push_back("ListItem2");
        mylist.push_back("ListItem3");
        mylist.push_back("ListItem4");
    
        // Hier den genauen Typ angeben der oben verwendet wurde
        // und dann ein ::iterator anfügen
        map<string,int>::iterator pIterMap;
        list<string>::iterator pIterList;
    
        file<<"Map Items\n";
    
        // .begin() zeigt auf den Anfang der map und .end() HINTER das letzte Element der map
        for(pIterMap = mymap.begin();pIterMap != mymap.end();++pIterMap)
            file<<pIterMap->first<<"="<<pIterMap->second<<'\n';
    
        file<<"\nList Items";
        for(pIterList = mylist.begin(); pIterList != mylist.end();++pIterList)
            file<<*pIterList<<'\n';
    
        return 0;
    }
    //---------------------------------------------------------------------------
    

    Schau Dir mal im Tutorial die Themen Iteratoren map und list an. Hilft Dir garantiert weiter.

    [ Dieser Beitrag wurde am 09.11.2002 um 22:58 Uhr von Knuddlbaer editiert. ]



  • @Knuddlbaer
    Danke, der code hilft mir sehr weiter 🙂 aber wie lade ich die daten wieder?? 😕



  • ifstream mit operator>>. die schleifen wirst du ja noch hinkriegen. immer in ein temporaeres objekt einlesen und dann pushen.



  • Und hier kommt noch Knuddlbaer Version 2:

    #include <vector>
    #include <iostream>
    #include <iterator>
    #include <fstream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    	vector<int> myVec;
    	myVec.reserve(100);
    	// Sinnloses befüllen des Vectors, hauptsache da is was drin
    	for(int i = 0;i < 100;++i)
    		myVec.push_back(i);
    
    	fstream datei("Ausgabe.txt", ios::out);
    	if(!datei)
    		return 20;
    
    	// Speichern
    	datei<<myVec.size()<<" "; // Optional
    
    	// Das ist das ganze Speichern. Bei Fragen fragen
    	copy(myVec.begin(),myVec.end(),ostream_iterator<int>(datei," "));
    
    	datei.close(); // Datei schliessen (wollen ja wieder draus lesen)
    
    	// Lesen
    	datei.open("Ausgabe.txt",ios::in);
    	if(!datei)
    		return 20;
    
    	myVec.clear(); 	// Vector leer machen, sonst heisst es noch ich les nix das
    					// stand da ja schon :clown:
    
    	vector<int>::size_type size; //Optional
    	datei>>size; //Optional
    	myVec.reserve(size); //Optional
    
    	istream_iterator<int> begin(datei); // Anfangsiterator auf die Datei
    	istream_iterator<int> end; // Enditerator
    	copy(begin,end,back_inserter(myVec)); // Und wieder auslesen.
    	// Kontrollausgabe ob das auch geht
    	copy(myVec.begin(),myVec.end(),ostream_iterator<int>(cout," "));
    	return 0;
    }
    

Anmelden zum Antworten