Hashes (dynamische Strukturen) in Datei speichern und lesen.
-
Hallo liebe gemeinde ich habe folgendes Problem.
Wir sollen ein Programm schreiben welches mit Hilfe von Hashes Daten einliest. Diese Daten sollen wir dann in eine Datei schreiben (Binär) und dann auch wieder auslesen.Also das Grundprogramm sieht folgendermaßen aus:
#include <iostream> #include <fstream> using namespace std; const int M=3; //Anzahl der Hashes struct element{ int value; struct element *next; }; struct element *H[M]; //(HASH TABLE) Array in der größe des Hashes mit verketteter liste für jedes element struct element *C[M]; int h(int x){ //errechnet den Hash, an welche stelle der Hash Table soll das element hin return x%M; } void insert (int x){ struct element *p = new element; p->value = x; p->next = NULL; int i = h(x); if (H[i] == NULL) H[i] = p; else { p->next = H[i]; H[i] = p; } } bool isMember(int x){ struct element *p; p = H[h(x)]; while(p != NULL && p->value !=x) p = p->next; if (p != NULL) return (p->value == x); else return false; } void print (){ cout << "H: " << sizeof(H); for (int i = 0; i <M; i++){ cout <<"H[" <<i <<"] = "; struct element *p = H[h(i)]; cout << "P: " << sizeof(p) << "\n"; while(p != NULL){ cout <<p->value <<" "; p = p->next; } cout <<endl; } } void main (){ int input; while (true){ cout <<"Integer (abbrechen mit negativem Integer: "; cin >>input; if (input <0) break; insert (input); } print(); cout <<"Integer suchen: "; cin >>input; if (isMember(input)) cout <<input <<" gefunden!" <<endl; else cout <<input <<" nicht gefunden!" <<endl; }Werte in eine Datei zuschreiben ist ja nicht das Ding, aber die komplette Struktur??
Also mein bisheriger Versuch war folgender:
Schreibenofstream ausgabe; ausgabe.open(dateiname.c_str(), ios::out|ios::binary); // zum binaeen Schreiben �oeffnen if (!ausgabe) { // Datei kann nicht geoeffnet werden cerr << dateiname << " kann nicht geoeffnet werden!\n"; exit(-2); } ausgabe.write((char *)&H, sizeof(H)); // Anzahl Bytes ab Adresse von H in Datei schreiben ausgabe.close();Lesen:
ifstream eingabe; eingabe.open(dateiname.c_str(), ios::in|ios::binary); // zum bin�en Lesen �fnen if (!eingabe) { // Datei kann nicht geoeffnet werden cerr << dateiname << " kann nicht ge�fnet werden!\n"; exit(-2); } int i = 0; while (eingabe.read((char *)&H[i], sizeof(H[i]))) {// Anzahl Bytes aus Datei lesen und ab Adresse H speichern cout << H[i++] << endl; //Hier dann print() } eingabe.close();Ich wäre für eure Hilfe sehr dankbar, denn ich schreibe morgen eine Programmieren Klausur und da sollte ich die obengenannte Problemstellung beherrschen.

Viele Grüße Ice
-
Ich würde an deiner Stelle nur die Zahlenwerte aus den einzelnen Hash-Blöcken in die Datei schreiben und beim auslesen die Listenstrukturen neu wieder aufbauen.
(btw, deine Funktionen kann man aber noch erheblich optimieren ;))