Instanzen in Datei schreiben
-
Hallo,
ich habe ein Problem mit Ostream. Der "Mist" wird einfach nicht in die Datei geschrieben. Könnt ihr mir sagen, wo mein Fehler liegt? Die Datei wird erstellt, aber nicht beschrieben.
void NeuPizza() { string Dateiname; PizzaList *Neu; Neu = new PizzaList; Dateiname = Neu->Init(); ofstream Out("PizzaListe2.dat", ios::out | ios::app); Out.write((char*)Neu, sizeof(Neu)); cout << "Pizza \"" << Dateiname <<"\" Erfolgreich geschrieben!" << endl; getch(); }
-
Du versuchst binär zu schreiben ohne das ofstream::binary flag? Du überprüfst nicht, ob die Datei geöffnet werden konnte? Und ofstream ist ios::out.
-
und außerdem erfasst write() nur die Daten, die innerhalb der Klasse enthalten sind. Viele Klassen (z.B. std::string oder std::vector<>) haben da nur einen Zeiger auf den Heap, hinter dem sie ihre Nutzdaten finden.
-
Rumper schrieb:
Hallo,
ich habe ein Problem mit Ostream. Der "Mist" wird einfach nicht in die Datei geschrieben. Könnt ihr mir sagen, wo mein Fehler liegt? Die Datei wird erstellt, aber nicht beschrieben.
void NeuPizza() { string Dateiname; PizzaList *Neu; Neu = new PizzaList; Dateiname = Neu->Init(); ofstream Out("PizzaListe2.dat", ios::out | ios::app); Out.write((char*)Neu, sizeof(Neu)); cout << "Pizza \"" << Dateiname <<"\" Erfolgreich geschrieben!" << endl; getch(); }Da ist so ziemlich jede Zeile auf gut Deutsch "scheiße". Wunderts dich?
-
314159265358979 schrieb:
Da ist so ziemlich jede Zeile auf gut Deutsch "scheiße". Wunderts dich?
Na, wenn Rumper wüßte wie man es richtig macht, würde er wohl nicht fragen.
Ich würde es gut finden, wenn man hier mit den Fragestellern etwas netter umgehen würde.@Rumper: prüfe bitte, ob PizzaList ein POD ist. Falls nicht, so kannst Du sie nicht auf diese Weise binär schreiben und lesen. Ist die Datei danach völlig leer oder steht irgendetwas drin?
Gruß
Werner
-
Hier mal ein paar Verbesserungsvorschkäge:
- Verwende einen Konstruktor, dann ersparst du dir das Init.
- Erstelle die Pizzaliste auf dem Stack.
- Überlade den ostream& operator << für deine Klasse Pizzaliste, dann ersparst du dir das POD gepfusche.
- Lass getch() weg, nimm stattdessen std::cin.get();
-
Konkret liegt das (bzw. ein) Problem darin, dass
Out.write((char*)Neu, sizeof(Neu));nur sizeof(PizzaList*) Byte in die Datei schreibt - also nur die ersten paar Byte. Wenn PizzaList alle relevanten Daten selbst enthält und POD ist, sollte
Out.write((char*)Neu, sizeof(*Neu));das Problem lösen. Enthält PizzaList Verweise auf andere Objekte oder ist nicht POD (enthält beispielsweise virtuelle Methoden), wirst du die Serialisierung von Hand vornehmen müssen.