Schreiben von Objekten in Datei nur in Main möglich
-
Hallo. Ich habe folgendes PRoblem . ICh habe eine KLass Zipper. In dieser Klasse Gibt es 2 Public Funktionen : Zip und Unzip. Wie man wohl vermuten kann werden Zip dateien erzeugt bzw. wieder entpackt. SOweit die Theorie. Als Daten nutze ich die Klasse ZipFile. INstanzen werden in der Funktion CreateZipFile erzuegt. Nun möchte ich ind er Klasse Zip eine Instanz in eine Datei schreiben und dann In Unzip wieder herauslesen. Allerdings kommt da immer eine FehlerMeldung,. Das komsche in der main funktion geht das mit dem schreiben iund lesen. Hier ist der code. weiß jemanda rat ? vieleb dank
main:
ZipFile zi; zi.SetZipFileName("Test1234"); ofstream out("Test.dat", ios::binary); out.write(reinterpret_cast<char*>(&zi), sizeof(ZipFile)); out.close(); ZipFile temp; ifstream in("Test.dat", ios::binary); in.read(reinterpret_cast<char*>(&temp), sizeof(ZipFile)); in.close();zipper :
Zipper::Zipper(string filename) { sZipName = filename; } // ===================================== // ZipFile Zipper::CreateZipFile(string filename) { ZipFile temp; temp.SetZipFileName(filename); return temp; } // ===================================== // bool Zipper::Zip() { ZipFile temp = CreateZipFile("1234.txt"); ofstream out(sZipName.c_str(), ios::binary); out.write(reinterpret_cast<char*>(&temp), sizeof(ZipFile)); out.close(); return true; } // ===================================== // bool Zipper::UnZip() { ZipFile temp; ifstream in(sZipName.c_str(), ios::binary); in.read(reinterpret_cast<char*>(&temp), sizeof(ZipFile)); in.close(); return true; }
-
"Eine Fehlermeldung"
Zum Arzt sagst du wenn der kleine Zeh gebrochen ist: "Ich bin körperlich beeinträchtigt. Behandeln sie mich"
Ich habe keine Lust ohne GENAUE Fehlermeldung mir überhaupt den Code anzusehen und das geht vielen anderen mit Sicherheit auch so.
-
Eine Anmerkung: Das ist nicht die Art und Weise wie in C++ serialisiert wird.
out.write(reinterpret_cast<char*>(&temp),...
-
Debug Assertion Failed!
File : dbgheap.c
Line : 1044Expression _CrtIsValidHeapPointer(pUserData))
-
Okay das habe ich mir scon gedacht. Ich habe auch schon den TIpp erhalten als XML Datei die Werte abzuspeichern. Aber das ist zu groß. ICh möchte möglichst platzsparend speichern.
-
Anstatt so einem unportablem Gefrickel mit Binärwerten solltest du wohl besser die XML Variante wählen. Wenn du Platzprobleme hast, sind die schnell behoben, indem du die Ausgabe komprimierst.
-
Hallo . Genau das will ich ja selbst machen. also ich möchte mir eine zipper für files schreiben. das geht auch schon nur habe ich noch keine rechten plan wie ich die daten speichern soll.
-
Du solltest dich mal mit C-PODs (Plain Old Data) und Objekten beschäftigen. Dein Ansatz erzeugt Objekte in einem willkürlichen Zustand und erzeugt undefiniertes Verhalten. Das folgende Beispiel verdeutlicht das:
struct MyData { char* Name; };sizeof( MyData ) liefert die Grösse der Struktur zurück, aber Name enthält nicht die eigentlichen Nutzdaten, sondern nur einen Zeiger auf einen weiteren Speicherbereich, der die Daten enthält. Wenn du den Inhalt per ofstream.write schreibst enthält die Ausgabedatei die Adresse des Speicherbereichs, an dem die Nutzdaten zum Zeitpunkt des Schreibens stehen. Beim Einlesen liest du die Adresse wieder ein, allerdings ist es Zufall, was sich an dieser Speicheradresse jetzt befindet => undefiniertes Verhalten.
-
Was würdest du mir vorlschlagen. Also um es noch einmal auf den Punkt zu bringen. ich möchte bereits gezippte daten in eine Datei speichern. und das möglischts platz sparend,. also es bringt mir nicht viel wenn ich eine datei erzeuge , dei größer ist als das orginal.
-
dercooleauswandere schrieb:
Was würdest du mir vorlschlagen. Also um es noch einmal auf den Punkt zu bringen. ich möchte bereits gezippte daten in eine Datei speichern. und das möglischts platz sparend,. also es bringt mir nicht viel wenn ich eine datei erzeuge , dei größer ist als das orginal.
Ehrlich gesagt, klingt das alles sehr wirr und ich bin mir nicht sicher, ob ich dich verstehe. Hier mein Tipp:
Guck dir mal gzstream oder eine vergleichbare Bibliothek an. Damit kannst du wie gewohnt Streamoperatoren benutzen um deine Daten im Klartext in eine Datei zu schreiben (beispielsweise als XML). Nur mit dem Unterschied, dass die Datei hinterher nicht im Klartext da steht sondern komprimiert ist. Einlesen aus der gepackten Datei ist genauso einfach.
-
Okay das ist dich schon was
Brauche aber her was für windwos. gzstream ist ja nur für linux geeignet
-
dercooleauswandere schrieb:
Okay das ist dich schon was
Brauche aber her was für windwos. gzstream ist ja nur für linux geeignetDa das alles Standard C++ ist, sollte das eigentlich auch unter Windows kompilierbar sein. Musst halt auch die zlib einmal portieren. Ansonsten würde ich mal google empfehlen, ich kann mir nicht vorstellen, dass es sowas nicht für Windows gibt. Vielleicht auch mal nach normalem zip anstelle von gzip suchen.