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:
    Schreiben

    ofstream 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 ;))


Anmelden zum Antworten