Dateiinhalt richtig einlesen



  • Grüß euch!
    Ich habe hier ein kleines Problem:
    Zwar programmiere ich ein spiel Namens PacMan, und wie bei jedem guten Spiel, soll man eine Highscore haben 😉
    So speichere ich neue Einträge ab:

    char username[50] = "test";
    	printf("\n Gib deinen Namen ein, um in die Bestenliste eingetragen zu werden (enter bestätigst du): ");
    	fflush(stdout);
    	fflush(stdin);
    	scanf("%s",username);
    	printf("\n");
    	FILE *highscore;
    	highscore = fopen ("highscore.txt", "a+");
    	if (highscore == NULL)
    	  {
    	    printf("Fehler beim oeffnen der Datei.");
    	  }
    	fprintf (highscore, "%s: %d Punkte, in %d Sekunden\n", username, punkte, 10);
    	fclose (highscore);
    

    Und so lese ich sie aus:

    char username[10][50] = {"test"};
    		int punkte[10] = {0};
    		int zeit[10] = {0};
    		int i;
    		FILE *highscore;
    		highscore = fopen ("highscore.txt", "a+");
    		if (highscore == NULL)
    		  {
    		    printf("Fehler beim oeffnen der Datei.");
    		  }
    		clrscr();
    		for (i = 0; i < 10; ++i) {
    			fscanf(highscore,"%s: %d Punkte, in %d Sekunden\n", username[i], &punkte[i], &zeit[i]);
    			printf("%s %d Punkte, in %d Sekunden\n", username[i], punkte[i], zeit[i]);
    		}
    		fclose(highscore);
    }
    

    Nur ich habe das Probelm, wenn ich sie auslese, dann schaut das ungefähr so aus:

    weini: 0 Punkte, in 0 Sekunden
    10 0 Punkte, in 0 Sekunden
    Punkte, 0 Punkte, in 0 Sekunden
    in 0 Punkte, in 0 Sekunden
    10 0 Punkte, in 0 Sekunden
    Sekunden 0 Punkte, in 0 Sekunden
    apfel: 0 Punkte, in 0 Sekunden
    10 0 Punkte, in 0 Sekunden
    Punkte, 0 Punkte, in 0 Sekunden
    in 0 Punkte, in 0 Sekunden
    

    In der Textdatei schaut es aber so aus:

    weini: 10 Punkte, in 10 Sekunden
    apfel: 10 Punkte, in 10 Sekunden
    test: 10 Punkte, in 10 Sekunden
    

    Ich hoffe ihr könnt mir helfen 😉

    weini

    ps. ich benutzte debian mit dem gcc 🙂



  • Dein fscanf-Formatstring ist falsch.
    "%s:" weist an, dass eine char-Folge bis '\0' oder Whitespace zu lesen ist, d.h. auch das ':' wird durch %s gelesen. Danach steht aber wiederum ':', das kann nicht gelesen werden, da schon "vorbei". Hierfür ist spezifiziert, dass *scanf abbricht, deine %d werden also nicht mehr gelesen.
    Für solche Fälle bietet *scanf den Rückgabewert an, der die Anzahl der erfolgreichen Formatinterpretationen zurückliefert, und für dich also ==3 liefern muss. Hättest du den verwendet, wäre dir der Fehler gleich bei fscanf aufgefallen.
    Statt "%s:" muss es hier also heißen "%s" oder besser "%[^:]:".



  • Wutz schrieb:

    Für solche Fälle bietet *scanf den Rückgabewert an, der die Anzahl der erfolgreichen Formatinterpretationen zurückliefert, und für dich also ==3 liefern muss. Hättest du den verwendet, wäre dir der Fehler gleich bei fscanf aufgefallen.

    Dieser Schurke...
    Jedes mal vergesse ich auf den Rückgabewert von scanf...
    danke für die info 🙂



  • Mal abgesehen von dem gelösten Problem (verzcihte auf den : ).

    Beim öffnen der Datei prüfst du zwar auf einen Fehler und meldest den auch.

    Danach machst du aber munter weiter und versuchst in/aus die/der Datei zu schreiben/lesen.



  • DirkB schrieb:

    Beim öffnen der Datei prüfst du zwar auf einen Fehler und meldest den auch.

    Danach machst du aber munter weiter und versuchst in/aus die/der Datei zu schreiben/lesen.

    Auf welche Fehler sollte man noch prüfen?
    Würde das gerne wissen, da ich noch nicht so gut bin und nicht alles weiß 😉
    wäre nett, wenn du es schreibst 😃

    weini



  • Wenn fopen scheitert und du einen NULL Zeiger zurückbekommst, dann
    führen weitere Zugriffe wie fprintf, fclose usw. zum Absturz.



  • Es würde erstmal ausreichen das fscanf/fprintf in einen else-Zweig vom if (highscore == NULL) zu packen.



  • Danke 🙂
    Werde mir den Tipp merken 😉

    weini


Anmelden zum Antworten