Objektvector in Datei schreiben



  • Hallo,

    ich habe einen vector mit mehreren Objekten die auf dem Heap liegen:

    vector<Data*>vData;
    	vDaten.push_back(new Data(name,position));
    

    Nun möchte ich diesen vector in eine Datei schreiben:

    vector<Data*>::iterator I = vData.begin();
    	fstream *oFile = new fstream("Daten.txt",ios::out|ios::binary); 
    
    	while(I != vData.end())
    	{
    
    		oFile->write((const char*)&(*I),sizeof(*I));
    		++I;
    
    	}
          oFile->close();
    

    Es lässt sich einwandfrei kompilieren aber irgendwie schreibt er die Daten
    nicht richtig in die Datei woran kann es liegen? Und wie kann man die Datei
    wieder mit einer Schleife einlesen also wieder alle Objekte hinauslesen
    und wieder in einem vector abspeichern?



  • Definiere Dir doch einen op<< und einen op>> für Deine Daten. Dann kannst Du leicht mit std::copy auf den stream rausschreiben.

    MfG Jester



  • Hm, schau mal in die FAQ, da steht was über Dateien und Ströme.

    Zu deinem Code:

    vector<Data*>::iterator I = vData.begin();
        fstream *oFile = new fstream("Daten.txt",ios::out|ios::binary);
    
        while(I != vData.end())
        {
    
            oFile->write((const char*)&(*I),sizeof(*I));
    // das sizeof(*I) ist nix anderes als ein sizeof(Data*).
    // und mit &(*I) erhälst du ebenfalls nur die Addresse des Pointers.
    // Du könntest jetzt **I schreiben, aber wer weis ob das überhaupt bei
    // einem Data Objekt sinnvoll ist ? 
            ++I;
    
        }
        oFile->close();
    


  • Danke für die schnellen Antworten.

    Hab mal den << Operator überladen und dann versucht die Daten zu speichern aber iregndwie schreibt er nur Zahlen in die Datei sieht für mich aus wie die Speicheradresse:

    ostream& operator<<(ostream& theStream, Data& theData)
          {
    	     theStream << theData.getName();
    	     theStream << theData.getCarton();
    	     theStream << theData.getPlaceInCarton();
    	     return theStream;
          }
    
          .
          .
          .
    
          fstream *file = new fstream("Data.txt",ios::out|ios::binary);
    
    	 I = Data.begin();
    
    	 while(I != vData.end())
    	 {
    		*file << (*I);
    		++I;
    	 }
    
    	 file->close();
    

    Hier der Inhalt der Datei bei der Ausgabe von zwei Datensätzen:

    00321138 003211C8



  • Wenn Du die Datei binär öffnest darfst Du Dich nicht wundern, daß scheinbar nur Byte-Müll drinsteht. Warum legst Du den stream eigentlich nicht auf den Stack?



  • Jester schrieb:

    Wenn Du die Datei binär öffnest darfst Du Dich nicht wundern, daß scheinbar nur Byte-Müll drinsteht. Warum legst Du den stream eigentlich nicht auf den Stack?

    So schreibe ich die Daten in die Datei:

    theStream << theFilm.getName() << "\n";
    	theStream << theFilm.getCarton() << "\n";
    	theStream << theFilm.getPlaceInCarton() << "\n";
    

    Und so lese ich die wieder aus:

    while(!file->eof()) 
         { 
             getline(*file, name, '\n'); 
             getline(*file, carton, '\n'); 
    	   getline(*file, placeInCarton, '\n'); 
    	   if(file->eof())break;
             else vData.push_back(new Data(name,carton,placeInCarton));   
    	   //name = carton = placeInCarton = "";
         }
    

    Klappt auch alles wunderbar jetzt 🙂 🙂

    Nur irgendwie würde mich mal interessieren wie das noch schöner mit dem >> operator und copy geht. Aus dem FAQ Beispiel werde ich irgendwie nicht wirklich schlau.


Anmelden zum Antworten