struct in/aus Datei speichern/lade
-
Hallo c/c++-Community,
ich hänge hier seit 2 Stunden an einem Problem und komme nicht weiter. Mein WG-Mitbewohner hat mir dieses forum empfohlen. Ich hoffe ihr könnt mir bei dierer Lamalie helfen.
Mein Ziel ist es ein Wer-Wird-Millionär Spiel in C++ zu Programmieren.
Ich schreibe gerade an der Management Schnittstelle, die es u.a. ermöglicht beim starten des Programms alle fragen und Antworten aus einer Datei ließt und beim beenden des Programms alle Fragen in diese Datei speichert.Ich habe folgendes struct gebaut:
typedef struct questionAnswersTuple { boole available; const char* question; const char* answer; const char* wrongAnswers[3]; } QATuple;Die verschiedenen QATuples speicehre ich in einer dynamischen liste mit einem Zeiger aus nächste Element:
typedef struct element{ QATuple qatuple; struct element* next; }Element;das speichern funktioniert wunderbar (zumindest ohne fehler ausführbar) mit folgernder Funktion:
int QuestionCatalog::saveQuestions(const char* dateiname){ int count = 0; ofstream outFile; outFile.open( dateiname, ios::out|ios::binary); if( !outFile) cerr << "Fehler beim Öffnen der Datei!" << endl; else { if (erstesElement != NULL){ Element *element; element = erstesElement; while (element != NULL){ if( !outFile.write( (char*)&element->qatuple, sizeof(QATuple))) cerr << "Fehler beim Schreiben!" << endl; count++; element = element->next; } outFile.close(); } } cout << count << " Fragen exportiert!!!" << endl; return count; }Allerdings funktioniert das lesen überhaupt nicht. Nach dem read() stürtzt das komplette programm ab...
int QuestionCatalog::loadQuestions(const char* dateiname){ Element *neueListe; int count = 0; ifstream inFile( dateiname, ios::in|ios::binary); if( !inFile) cerr << "Konnte Backup-Datei nicht laden!" << endl; else { QATuple neuesTuple; while (!inFile.eof()){ if( !inFile.read( (char*)&neuesTuple, sizeof(QATuple))) cerr << "Fehler beim Lesen" << endl; count++; Element *neuesElement = new Element(); neuesElement->qatuple = neuesTuple; if (neueListe == NULL) neueListe = neuesElement; else{ Element *hilf; while( (hilf = hilf->next) != NULL); hilf->next = neuesElement; } } inFile.close(); } return count; }Es wäre wirklich super, wenn mir jemand sagen könnte was ich falsch mache, dennn ich verzweifle gerade...
-
habs nicht genau angeschaut, aber wenn du nur die struktur mit dne pointern speicherst, hast du den string noch lange nicht gespeichrt
-
Hallo,
Tu dir erstmal einen Gefallen und verwende konsequent C++ Sprachmittel.
Ersetze alle char* durch std::string
statt der eigenen Liste std::list oder std::vector
Die Daten speicherst du besser im Textmodus. Das vergrößert zwar die Datei vereinfacht aber das Einlesen.
-
Braunstein schrieb:
statt der eigenen Liste std::list oder std::vector
Die Daten speicherst du besser im Textmodus. Das vergrößert zwar die Datei vereinfacht aber das Einlesen.Danke für deine Antwort. Es wurde uns von unserer Professoring aufgetragen beim starten und beenden in eine binäre datei zu schreiben/lesen und nochmal extra im Programm Fragen über eine normale Textdatei importieren und exportieren zu können.
Wir sollen auch eine selbstprogrammierte Liste verwenden...
-
schau dir mal den inhalt der gespeicherten datei an, dann wirst du sehen, dass was fehlt.
-
Proggen-ist-super schrieb:
Wir sollen auch eine selbstprogrammierte Liste verwenden...
Selbst dann ist:
typedef struct //...Ein Relikt aus alten Zeiten. Du definierst automatisch einen Typ per struct/class/enum auch ohne Typedef. Der Typ hat den Bezeichner, der hinter dem entsprechenden struct/class/enum steht.
-
Dann würde ich der struct eine read und eine write-Methode spendieren, die das binäre Lesen und Schreiben übernehmen. Die braucht man dann nur noch aufzurufen. Für späteres textorientiertes Lesen und Schreiben kann man dann ja noch die Streamopreatoren für dies struct erzeugen.
struct questionAnswersTuple { bool available; const char* question; const char* answer; const char* wrongAnswers[3]; std::istream& read(std::istream& in); std::ostream& write(std::ostream& out) const; };