aus Binärdatei lesen funktioniert nicht
-
Die Klasse liest jeweils zwei Messwerte der Struktur ein und speichert es sequentiell in eine Binärdatei. Beim Einlesen der Datei und Anzeige gibt es aber noch Probleme.
struct Werte { double mess1; double mess2; }; const int feld = 240; class Verarbeitung { private: Werte messplatz[feld]; int zaehl, i; char antwort; public: Verarbeitung() { for (i = 0; i < feld; i++) { messplatz[i].mess1 = 0.0; messplatz[i].mess2 = 0.0; } i = 0; } void Eingabe() { i = 0; zaehl = 1; do { cout << "\n-Eingabe Messwerte " << zaehl << " -" << endl; cout << "Wert 1: "; cin >> messplatz[i].mess1; cout << "Wert 2: "; cin >> messplatz[i].mess2; zaehl++; i++; cout << "Weitere Eingabe (j/n) ? "; cin >> antwort; } while (antwort == 'J' || antwort == 'j'); } void Ausgabe() { i = 0; zaehl = 1; do { cout << "\n-Ausgabe Messwerte " << zaehl << " -" << endl; cout << "Wert 1: " << messplatz[i].mess1 << endl; cout << "Wert 2: " << messplatz[i].mess2 << endl; zaehl++; i++; cout << "Weitere Ausgabe (j/n) ? "; cin >> antwort; } while (antwort == 'J' || antwort == 'j'); } void Export() { fstream outfile; outfile.open("/x/mess.dat", ios :: out | ios :: app | ios :: binary); outfile.write((char*)this, sizeof(this)); //outfile.write((char*)(&messplatz), sizeof(messplatz)); outfile.close(); } void Import() { fstream infile; infile.open("/x/mess.dat", ios :: in | ios :: binary); if (infile) cout << "Datei wurde noch nicht angelegt!"; infile.seekg(0); while(infile) { //infile.read((char*)(&messplatz), sizeof(messplatz)); if (infile != 0) { wait(); Ausgabe(); wait(); } wait(); } infile.close(); } }; int main() { Verarbeitung Platz1; int auswahl; do { clrscr(); gotoxy(1, 1); cout << "-Auswahlmenue-" << endl; cout << "(1) \t Messwerte eingeben und in Datei schreiben" << endl; cout << "(2) \t Messwerte aus Datei lesen und anzeigen" << endl; cout << "(3) \t Beenden" << endl; cout << "\nAuswahl: "; cin >> auswahl; switch(auswahl) { case 1: // Eingabe der Werte Platz1.Eingabe(); Platz1.Export(); break; case 2: // Ausgabe der Werte Platz1.Import(); Platz1.Ausgabe(); break; case 3: // Ende break; default: cout << "Eingabefehler" << endl; wait(); } } while (auswahl < 3); wait(); clrscr(); gotoxy(1, 1); cout << "Programmende" << endl; wait(); return 0; }
Wenn ich eingebene Werte von einer Datei anzeigen will, springt nur der Konstruktor ein. Also irgendwo muss ich was übersehen haben.
Auch sonstige Fehler/Verbesserungen melden.
-
Abgesehen davon, dass deine Klasse kein POD ist und dieser Code daher undefiniertes Verhalten hat, sollte es hier:
outfile.write((char*)this, sizeof(this));
doch wahrscheinlich sizeof *this heißen, sonst schreibst du nur 4 Bytes in die Datei ...
-
Was ist daran nicht korrekt?
dass deine Klasse kein POD ist
Soll ich dann den Konstruktor weglassen ?
-Wie fang ich dann das Ende der Datei ab ?
-sizeof(*this) hab ich natürlich
Macht es eigentlich einen Unterschied, ob ichoutfile.write((char*)this, sizeof(*this));
oder
//outfile.write((char*)(&messplatz), sizeof(messplatz));
schreibe ?
Das Einlesen funktioniert immer noch nicht.
-
Zickedi schrieb:
Was ist daran nicht korrekt?
dass deine Klasse kein POD ist
Soll ich dann den Konstruktor weglassen ?
Nein, die einzelnen Felder separat abspeichern und laden.
-Wie fang ich dann das Ende der Datei ab ?
Wie immer.
-sizeof(*this) hab ich natürlich
aha, nur falsch abgetippt?
Macht es eigentlich einen Unterschied, ob ich
outfile.write((char*)this, sizeof(*this));
oder
//outfile.write((char*)(&messplatz), sizeof(messplatz));
schreibe ?
Logisch, ersteres schreibt die ganze Instanz in die Datei, letzteres nur den Inhalt des messplatz-Arrays. Was mich nahtlos zu der Frage bringt, was die zusätzlichen Membervariablen eigentlich für einen Zweck erfüllen? Augenscheinlich keinen, das sollten lokale Variablen der jeweiligen Funktionen sein.
BTW: Der Adressoperator vor messplatz ist unnötig.
Das Einlesen funktioniert immer noch nicht.
Ich versteh den Code nicht. Warum ist da eine Schleife drin?
-
aha, nur falsch abgetippt?
Bin mittlerweile beim Try/Error-Verfahren.
Daher kommt das.
zu der Frage bringt, was die zusätzlichen Membervariablen eigentlich für einen Zweck erfüllen
Die Aufgabenstellung gibt vor, die Messwerte in ne Struktur zu packen.
Warum ist da eine Schleife drin?
Welche Schleife?
-
Zickedi schrieb:
Bin mittlerweile beim Try/Error-Verfahren.
Daher kommt das.
Schlechte Idee, das bringt überhaupt nichts, weil die meisten Fehler zunächst unbemerkt bleiben oder deren Auswirkungen nicht zugeordnet werden können. Du solltest immer wissen, was du tust und warum du es tust.
zu der Frage bringt, was die zusätzlichen Membervariablen eigentlich für einen Zweck erfüllen
Die Aufgabenstellung gibt vor, die Messwerte in ne Struktur zu packen.
Ich rede von zusätzlichen Variablen. Also alle ausser dem Messwert-Array. Die sind anscheinend unnütz und sollten nicht Membervariablen sein.
Warum ist da eine Schleife drin?
Welche Schleife?
die while-Schleife in Import()
-
zusätzlichen Variablen
Ich muss die doch irgendwo definieren. Wüsste jetzt nicht, wie ich das anders anstellen sollte.
[quote]while-Schleife in Import()[quote]
Die liest aus der Datei aus, solange Zeichen darin vorhanden sind.if (!infile) cout << "bla";
müsste es auch heißen.
Hm, irgendwie steh ich auf dem Schlauch.
-
Zickedi schrieb:
zusätzlichen Variablen
Ich muss die doch irgendwo definieren. Wüsste jetzt nicht, wie ich das anders anstellen sollte.
Nur da, wo sie gebraucht werden. Der Gültigkeitsbereich einer Variablen sollte immer so klein wie möglich sein ... nimm z.B. deine Variable i. Die kommt in 3 Funktionen vor, aber sie wird am Ende auf 0 gesetzt bzw. ihr Wert am Ende ist irrelevant, weil sie am Anfang der anderen Funktionen auf 0 gesetzt wird. Anders gesagt, der Wert von i gehört nicht zum Zustand des Objektes. i sollte demzufolge im Kopf der for-Schleife im Konstruktor sowie jeweils am Anfang von Eingabe und Ausgae deklariert werden.
Ähnliches gilt für zaehl und antwort.
[quote][quote]while-Schleife in Import()
Die liest aus der Datei aus, solange Zeichen darin vorhanden sind.
Aber warum? Dein Array hat nur soundsoviele Einträge, was wenn die Datei länger ist? Dann überschreibst du das Array immer wieder ... wo ist da der Sinn?
-
i sollte demzufolge im Kopf der for-Schleife im Konstruktor sowie jeweils am Anfang von Eingabe und Ausgae deklariert werden.
Dann hab ich das bisher immer falsch gelernt. Selbst unser Prof definiert i am Anfang der Klasse.
Ich will jetzt nur mal, dass er die eingegebenen Werte wieder aus der Datei liest.
Ob der Array auch wirklich so gross ist wie die Datei spielt erst mal keine Rolle.
-
Wenn ich das Programm unter Windows starte, funktioniert es wie gewollt.
Also hat es wohl etwas mit der Linux-Oberfläche zu tun...
-
Zickedi schrieb:
i sollte demzufolge im Kopf der for-Schleife im Konstruktor sowie jeweils am Anfang von Eingabe und Ausgae deklariert werden.
Dann hab ich das bisher immer falsch gelernt. Selbst unser Prof definiert i am Anfang der Klasse.
Dafür kann er bestimmt andere Dinge ganz toll
Wenn ich das Programm unter Windows starte, funktioniert es wie gewollt.
Also hat es wohl etwas mit der Linux-Oberfläche zu tun...Komische Schlussfolgerung. Ich teste das mal ... bei mir gehts.
-
Hm, woran könnte es dann liegen?
Beim Einlesen gibt er mir nur den Konstruktorwert wieder -> Wert1: 0, Wert2: 0.
Bei Windows gibt er mir sauber die Werte der Datei aus.Kanns am Header liegen ?
Welche hast du eingebunden?
-
#include <iostream> #include <fstream> #include <ostream> #include <istream>
Den ganzen conio-Kram hab ich entfernt.
-
Jetzt funktioniert es, habe mal den Pfad geändert und siehe da.
Hat auch mit dem Löschen der Datei zu tun.
Werd das nochmal bearbeiten.Aber schon wieder was gelernt.