Probleme mit ifstream / ofstream Filebuffer



  • Hallo. Ich habe folgendes Problem . Ich öffne eine Datei und Lese den Inhalt in einen Filebuffer. Gleichzeit öffnen ich einen andere Datei und schreibe den dazugehöriogen Filebuffer. Mein Problem besthe darin, dass bei Textdateien die Kopie sehr gut aussieht. aLso richtig erstellt wrid. Bei Bild oder auch exe dateien lassen sich die Kopien nicht öffnen. WEnn man sich dann den Inhalt der neu geschriebenen Datei ansieht stellt man fest, dass nicht alles hineingeschrieben worden ist. HIer ist mein Code, habe schoon verschiedene MOdi zum öffnen und schrieben versucht. weiß jemand rat. vielen dank

    // Öffne die Datei 
    	ifstream file(Filename.c_str());
    
    	ofstream out("Testbild.txt", ios::binary);
    	streambuf  *Filebuffer2 = out.rdbuf();
    
    	if (file.good())
    	{
    		// Lese den Datei puffer aus
    		filebuf *Filebuffer = file.rdbuf();
    
    		// Schreibe den Inhalt in den buffer.
    		while (Filebuffer->sgetc()!=EOF)		
    		{
    			Preview.push_back(Filebuffer->sbumpc());
    			Filebuffer2->sputc(Preview[Preview.size()-1]);
    		}
    
    		// Schließe die Datei
    		file.close();
    		out.close();
    

    }



  • Hallo,

    Bei Binärdateien solltest du auch binär lesen. Im Augenblick liest du im Textmodus.



  • Danke für den Tipp das war schon ganz gut . Aber jetzt habe ich noch ein anders Problem : Ich schreibe ein Vector Objekt binär in eine Datei und lese es dann wieder aus.
    Beim schrieben geht alles gut aber beim auslesen bekomme ich einen fehler :
    Es kann auf eine Stell im speicher nicht zugegriffen werden.
    Hier mein Code :

    Schreiben :

    ofstream zipfile(Filename.c_str(), ios::binary);
    
    	// Schreibe alle ZipFile Objekte in das File
    	for (int i = 0; i < files.size(); i++)
    	{
    		ZipFile temp;
    		temp = CompressFile(files[i]);
    		vZipFile.push_back(temp);	
    	}
    
    	zipfile.write(reinterpret_cast<char*>(&vZipFile),sizeof(vector<ZipFile>));		
    
    	zipfile.close();
    

    Lesen :

    ifstream zipfile(Archivname.c_str(), ios::binary);
    
    		vector<ZipFile> temp;
    		zipfile.read(reinterpret_cast<char*>(&temp),sizeof(vector<ZipFile>));
    
    		cout << "Anzahl : " << temp.size() << "\n";
    
    	zipfile.close();
    

    WEiß jemand Rat?


  • Mod

    Ich will jetzt nicht dein spezielles Problem nachvollziehen, denn du hast ein viel größeres: Das was du da machst, wird nicht so funktionieren, wie du willst. Ein Vector ist quasi nur eine Zahl für die Größe und ein Zeiger auf das erste Element. Das ist alles was du abgespeichert und geladen hast. Die Daten gehören nicht dazu.



  • Danke für deine Antwort. ALso müsste ich dann die Elemente einzel n spiechern ?



  • dercooleauswandere schrieb:

    ALso müsste ich dann die Elemente einzel n spiechern ?

    Ja.


  • Mod

    Und ein guter Rat: Speicher Daten nicht binär ab, sondern in einem menschenlesbaren Format.



  • Hallo. Ja aber das geht mit Objekten leider nicht, oder ich kenne kein möglichkeit.


  • Mod

    dercooleauswandere schrieb:

    Hallo. Ja aber das geht mit Objekten leider nicht, oder ich kenne kein möglichkeit.

    Letzteres.

    Die einfachst umzusetzende Möglichkeit ist, die einzelnen Datenelemente im Klartext zu speichern. Wenn deine Objekte komplexer sind, kannst du dir ja mal Formate wie XML angucken, um etwas Struktur reinzubringen.



  • Nein XML ist für mich keine Lösung ich möchte doch nur eine paar Objekte in eine Datei speciher, dabei darf man das Format der Datei nicht ändern. Und wenn ich das in für menschen lesbarer form mache ist das natürlich deutlich leichter als wenn ich die objekte speichere. Deshalb noch mal die frage wie speichere ich ein objekt in eine datei und wie lese ich das wieder aus

    noch einen schönen abend



  • dercooleauswandere schrieb:

    Nein XML ist für mich keine Lösung ich möchte doch nur eine paar Objekte in eine Datei speciher,

    Und warum heißt "nur ein paar Objekte speichern" zwangsläufig "XML ist keine Lösung"? Grade wenns nur ein paar Objekte (bzw. deren Inhalt) ist, ist XML schnell zur Hand.

    dabei darf man das Format der Datei nicht ändern.

    Ach so, es gibt ein vorgegebenes Format? Dann musst du die Daten der Objekte doch nur in das Format umwandeln und abspeichern. Beim Einlesen der umgekehrte Weg.

    Und wenn ich das in für menschen lesbarer form mache ist das natürlich deutlich leichter als wenn ich die objekte speichere.

    "Die Objekte speichern" an sich gibts nicht. Es muss immer das Objekt in irgendeiner Form in die Datei geschrieben werden. Menschenlesbar oder eben nicht.

    Deshalb noch mal die frage wie speichere ich ein objekt in eine datei und wie lese ich das wieder aus

    Dann nochmal die Antwort: Indem du die Daten der Objekte in einem geeigneten Format in die Datei schreibst bzw. das entsprechende Format aus der Datei wieder rausliest.


Log in to reply