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 schreibstweini
-
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 merkenweini