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; }