Problem bei eigener record() Funktion



  • Hallo,
    Der unten stehende Code soll eine Rekord Tabelle meines Spiels darstellen. Die Ergebnisse werden zuvor in einer "struct stat_item" gespeichert. Diese soll dann in eine Datei geschrieben werden und direkt danach, untereinander ausgegeben werden. Jedoch sollen nur insgesamt 6 Einträge ausgelesen werden, diese sollen dann noch nach der größe von "stat_item.win_words" abwärts angeordnet werden sollen.

    Noch ein Problem ist, wenn ich wieder aus der Funktion zurückgehe und sie dann wieder betrete, schreibt er mir den gleichen Eintrag nochmal rein und gibt ihn mir auch wieder aus. So kann es passieren das >6 mal die gleichen Einträge dort stehen.

    int game_records()
    {
        FILE *records;
        unsigned short int i, y = 9;
        ...
        /* write into the record file */
        if((records = fopen("../stats/records.txt", "a+")) == NULL)
        {
            endwin();
            fprintf(stdout, "Unable to write in record table!");
            return -1;
        }
        else
        {
            fwrite(&stat_item, sizeof(stat_item), 1, records);
            fclose(records);
        }
    
        /* read from the record file */
        if((records = fopen("../stats/records.txt", "r")) == NULL)
        {
             endwin();
             fprintf(stdout, "Unable to read from record table!");
             return -1;
        }
        else
        {
             while((fread(&stat_item, sizeof(stat_item), 1, records) == 1))
             {
                  mvprintw(y, 8, "%s", stat_item.name);
                  mvprintw(y,24, "%d", stat_item.severity);
                  mvprintw(y,40, "%d", stat_item.win_words);
                  mvprintw(y,56, "%d", stat_item.lose_words);
             }
    
             fclose(records);
        }
    
    	for(;;)
    	{
    		switch(getch())
    		{
    			case ESCAPE: game_menu(); break;
    			default: break;
    		}
    	}
    }
    

    Ich hoffe mir kann einer bei diesen Problem ein bischen helfen, denn allein komme ich nicht weiter.

    Danke



  • Dass du die Einträge nach vielen Aufrufen öffter drinstehen hast, wundert mich überhaupt nicht. Schau mal in deiner C-Doku nach was der Modus "a" bei fopen() macht ;).

    Zum Einlesen und Ausgeben:

    Grundsätzlich würde ich sowas trennen. D. h. erst alle Datensätze in ein dynamisches Array einlesen, dann weiterverarbeiten, z. B. sortieren, und erst dann ausgeben.


Anmelden zum Antworten