Daten aus Klassen in Dateien schreiben
-
Ich meinte damit, daß du den Schreib-Methoden einen ostream übergibst - das tatsächliche Schreiben bleibt den Unterklassen überlassen:
class EineFreq : public KompoMass { float Minimum; int Anzahl; public: ... void speichere(ostream& out) { KompoMass::speichere(out); out<<Minimum<<" "<<Anzahl<<endl; } }; class GesamtFreq { EineFreq Bauteil1; EineFreq Bauteil2; public: ... void speichere(ostream& out) { Bauteil1.speichere(out); Bauteil2.speichere(out); } }; ... GesamtFreq Anlage; ... ofstream ausgabe(...); Anlage.speichere(ausgabe);
-
Ok, ich verstehe es nun. War eine schwere Geburt.
Ich baue noch etwas meine Aufrufe um, damit die Umkonvertierung der Daten auf der Visuseite passiert und nicht mehr in den Klassen und dann werde ich das mit der Übergabe des ostream probieren.
Vielen Dank nochmal, du hast mir sehr geholfen.

Grüße aus dem Schwabenländle.
-
Also habe das nun mal eingebaut, aber irgendwie funktioniert das nicht.
Sobald ich die Zeile
void speichere(ostream& out);drin habe, bekomme ich gleich die Meldung:
) erwartet und bleibt nach dem & stehen. Der Compiler nimmt die Zeile nur, wenn ich & out weglasse, dann funktioniert aber der Rest nicht, da er ja das out nicht mehr kennt.
Was mache ich falsch?
-
Wo hast du denn diese Zeile stehen? Und kennt der Compiler auch die Klasse "ostream" (#include <iostream> - und den Namensraum std:: beachten)?
-
Ich habe in der Headerdatei KompoMass eine Funktion angelegt.
void speichere(ostream& out);danach habe ich noch versucht #include <ostream> ging aber nicht und mit #include <iostream> geht es auch nicht.
Habe den restlichen Code auskommentiert, so dass eigentlich nur noch diese Anweisung drin bleibt, dadurch dürfte er auch nicht mit dem namespace in einem konflikt geraten.
-
Hast du mal versucht, den Namensraum explizit anzugeben?
#include <iostream> void speichere(std::ostream& out);
-
Hey, das wars.
Aber warum ich den Namensraum explizit angeben muß ist mir nicht klar.Werde mal den restlichen Code aktivieren und mal schauen was passiert.
Nochmals danke.
-
egcactus schrieb:
Hey, das wars.
Aber warum ich den Namensraum explizit angeben muß ist mir nicht klar.Weil so ziemlich alle Bestandteile der Standardbibliothek in diesem Namensraum untergebracht sind
Damit hast du drei Möglichkeiten, an den Bezeichner heranzukommen - explizite Namensraum-Angabe "std::ostream" (gilt nur für diese eine Code-Stelle), using-Deklaration "using std::ostream;" (gilt ab da für alle Vorkommen von ostream) oder using-Direktive "using namespace std;" (gilt für ALLE Bezeichner aus dem Namensraum) - letzteres ist für Header nicht zu empfehlen.
-
Also es kam noch ein kleiner Fehler: Der Compiler bemängelte im Formular von wo ich das aufrufe, dass er "ofstream" nicht kennt, aber da hat dann nur die
#include <fstream>Anweisung noch gefehlt.
Aber der Rest funktioniert einwandfrei.
Werde das ganze noch etwas umgestalten, so das der ofstream Aufruf in der Klasse GesamtFreq erfolgt und dass man den Dateinamen ändern kann, aber sonst ist das absolut Klasse.
Vielen herzlichen Dank nochmal. Denke wir werden uns bestimmt wieder sehen. Bin an diesem Projekt noch eine Weile beschäftigt. Und wenn wieder eine Frage auftaucht, die mich nicht schlafen lässt, dann weiß ich nun, dass ich hier Hilfe bekomme.
Viele Grüße aus dem Schwabenländle.
-
Ich habe eine neue Lösung für mein Problem, habe es nun so gelöst:
Die Klasse GesamtFreq ruft die Unterklassen auf, in denen die als PRIVATE Werte gespeichert werden.
class GesamtFreq { public: class EineFreq Bauteil1; class EineFreq Bauteil2; // Daten in Datei schreiben void speicherInDatei(GesamtFreq); // Daten aus Datei lesen GesamtFreq leseAusDatei(void);In den Funktionen speicherInDatei und leseAusDatei werden die Daten gespeichert bzw. geladen.
void GesamtFreq::speicherInDatei(GesamtFreq UserFreq) { ofstream fout("Datei.txt",ios::binary); fout.write((char*) &UserFreq, sizeof UserFreq); fout.close(); }GesamtFreq GesamtFreq::leseAusDatei(void) { GesamtFreq DefaultFreq; ifstream fin("Datei.txt",ios::binary); fin.read((char*) &DefaultFreq, sizeof DefaultFreq); fin.close(); return DefaultFreq; }Was hälst du von dieser Lösung? Oder verstosse ich gegen jede Regel der Programmierung?
Ich spare mir dadurch den ostream zu übergeben und danach die Daten mühselig wieder zu trennen. Da ich durch die verschiedenen Stringglängen bei den Komponenten und dadurch, dass ich mir die Masseinheiten, je nachdem in welchem Spektrum es gemessen werden soll bei jedem Bauteil, mehrmals notiere, kam ich immer wieder zu Verschiebungen in den Daten beim wieder einlesen.
Grüße aus dem Schwabenländle.