Hash Tabelle mit Doppelt verketteten Listen



  • hashtabelle[4][3].leben=10;
    


  • Also das klappt nun alles sehr gut. Ich hab jetzt noch eine andere Anwendung die ich bräuchte. Und zwar will ich etwas von einer Datei in eine Hash Tabelle einlesen. Ich hab hier mal experimentel was geschrieben aber ich bekomme immer einen Fehler beim öffnen der Datei.

    Jemand ne Anmerkung?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define SCHIFFANZAHL 8
    
    struct stats {
    	int name, spawn, kosten, angriff, leben, schussweite;
    };
    
    int einlesen ()
    {
    	struct stats *ships[1]= {0};
    
    	if ( NULL == ( ships[0] = calloc ( SCHIFFANZAHL, sizeof ( struct stats )))) {
    		printf("Fehler bei Speicherplatzreservierung");
    
    	}
    
    	char bla[30];
    	int i=0;
    	FILE *f= fopen("stats.txt","r");
    
    	if (f==NULL) {
    		printf("Fehler beim öffnen der Datei\n\n");
    		return 0;
    		fclose(f);/*Datei schließen*/
    		free(ships[0]);
    	}
    
    	for (i=0; i<SCHIFFANZAHL; i++) {
    		fscanf(f, "%s %d %d %d %d %d %d",bla[30] ,ships[0][i].name, ships[0][i].spawn ,ships[0][i].kosten ,ships[0][i].angriff ,ships[0][i].leben ,ships[0][i].schussweite);
    		printf("  Name: %s", bla);
    		printf("%d %d %d %d %d %d\n" ,ships[0][i].name, ships[0][i].spawn ,ships[0][i].kosten ,ships[0][i].angriff ,ships[0][i].leben ,ships[0][i].schussweite);
    	}
    	fclose(f);/*Datei schließen*/
    
    	free(ships[0]);
    	return 1;
    }
    
    int main()
    {
    
    	einlesen();
    	getchar();
    }
    


  • Wo liegt denn die Datei? Im Debug/Release-Verzeichnis?

    Hast du schon mal den kompletten Pfad ausprobiert?

    Die Anweisungen ach dem return 0; werden nicht mehr ausgeführt.
    Also auch kein free.



  • Oh man ich mal wieder....Hab das return 0; verschoben.

    Die Datei liegt überall.

    Hab ein Exemplar im Debug und eins im Release Ordner. Beides geht nicht.

    Edit: Sinn in die Sätze gebracht.



  • Geh doch mal mit der Shell/Cmd oder dem Explorer in das Verzeichnis von der exe und starte es dort.



  • Du solltest bei fehlgeschlagenem calloc ebenso aus der Funktion raus.
    Verwende

    perror("stats.txt");
    

    vor dem return, um genauere Fehlerbeschreibungen zu erhalten.



  • Wutz schrieb:

    Du solltest bei fehlgeschlagenem calloc ebenso aus der Funktion raus.
    Verwende

    perror("stats.txt");
    

    vor dem return, um genauere Fehlerbeschreibungen zu erhalten.

    Danke für den Tipp. Er sagt die Datei gibt es nicht... Ich mache hier also irgend ein unendlich banalen Fehler wie es mir scheint ...

    EDIT: Ahja....die Datei hat heißt "stats.txt.txt"....niemals versuchen die Endung mit in den Dateinamen zu schreiben..... So weit so gut. Jetzt hab ich ber das Problem das er die Daten nicht ausliest aus der Datei. Ich hab mal den nhalt der Datei angehängt:
    quote] Jäger
    1
    1
    5
    10
    30
    1
    Fregatte
    2
    1
    100
    50
    300
    1
    Kreuzer
    3
    2
    200
    1000
    1
    Schlachtkreuzer
    4
    5
    1000
    1000
    3000
    1
    laser1
    51
    1
    5
    10
    30
    1
    laser2
    52
    1
    100
    50
    300
    1
    laser3
    53
    2
    200
    1000
    1
    laser4
    54
    5
    1000
    1000
    3000
    1[/quote]

    Das Ziel ist es die Zahlen auszulesen. Den Namen brauch ich garnicht der wird einfach in der Variablen "bla" zwischengespeichert und dann wieder überschrieben.



  • Bei scanf sollte man für nicht-Arrays schon de nQAdressoperator verwenden.
    Das nicht-Array bezieht sich auf den Typ den du einlesen willst. Z.B. mit %d ein int.



  • Warum ist ships ein *ships[1] und nicht einfach ein *ships ?
    Bei nur einem Eintrag macht das doch nur mehr Aufwand beim Zugriff.



  • DirkB schrieb:

    Warum ist ships ein *ships[1] und nicht einfach ein *ships ?
    Bei nur einem Eintrag macht das doch nur mehr Aufwand beim Zugriff.

    Mit dem Index ist es einfacher zu arbeiten fande ich. Ich schätze aber mal man kann den 1. Index auch weglassen und trozdem den Zugriff wie auf eine Hashtabelle nutzen.

    Wie dem auch sei es funktioniert (schon seid längerem). Und hier nochmal zur Vollständigkeit die jetztige Version.

    void einlesen ()//Einlesen der Stats aus der txt Datei.
    {
    
    	int i=0;
    	FILE *f= fopen("stats.txt","r");
    
    	if (f==NULL) {
    		printf("Fehler beim Oeffnen der Datei: stats.txt\n\n");
    		perror("stats.txt");
    		getchar();
    		fclose(f);/*Datei schließen*/
    		terminate();
    		getchar();
    	}
    
    	for (i=0; i<SCHIFFANZAHL; i++) {
    		fscanf(f, "%d %d %d %d %d %d",&ships[0][i].name, &ships[0][i].spawn ,&ships[0][i].kosten ,&ships[0][i].angriff ,&ships[0][i].leben ,&ships[0][i].schussweite);
    		//printf("%d %d %d %d %d %d\n" ,ships[0][i].name, ships[0][i].spawn ,ships[0][i].kosten ,ships[0][i].angriff ,ships[0][i].leben ,ships[0][i].schussweite);
    	}
    	fclose(f);/*Datei schließen*/
    
    }
    

    Danke für eure Hilfe


Anmelden zum Antworten