-
Also hier die Funktion:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
void highscoreabfrage (int cou) { int i, a, highscore, j, s_wert, c; // in a werden die Plätze der eingelesenen Rangliste gespeichert. In highscore werden die scores der Plätze der eingelesenen Rangliste gespeichert. char puffer[20], save[20]; // in s_wert wird der Rückgabewert von scanf() gespeichert FILE *scores; scores = fopen ("Snake_Highscore.txt", "r+"); if (scores == NULL) { printf ("\nHighscores nicht verfuegbar ...\n\n"); return; } else { for (i = 0; i < 5; i++) { s_wert = fscanf (scores, "%d. %d\n", &a, &highscore); if (s_wert != 2) // Falls es vor dem Ende zu einer fehlerhaften Eingabe kommen sollte { fprintf (stderr, "\nFehler beim Speichern der Highscore ...\n\n"); return; } if (cou > highscore) { fseek (scores, 0L, SEEK_SET); for (j = 0; j < i; j++) { fgets (puffer, 20, scores); } c = fprintf (scores, "%d. %d\n", j+1, cou); // Der neue Wert wird an der passenden Stelle eingefügt und die Highscore wird überschrieben printf ("%d", c); printf ("\nGratulation! Du hast im Highscore den %d.Platz erreicht!\n\n", j+1); fgets (save, 20, scores); fseek (scores, 0L, SEEK_SET); for (j = 0; j < i+1; j++) { fgets (puffer, 20, scores); } if (j == 5) { return; } fprintf (scores, "%d. %d\n", i+2, highscore); // Jetzt wird der vom Vergleich gespeicherte Werte einen Platz darunter eingefügt for (i = i+2; i < 5; i++) { fprintf (scores, "%s", save); fseek (scores, 0L, SEEK_SET); for (j = 0; j < i; j++) { fgets (puffer, 20, scores); } fgets (save, 20, scores); } fclose (scores); return; } } printf ("\nSie haben es leider nicht in die Highscore geschafft ...\n\n"); return; } }
Dann die *.txt-Datei vor dem ersten Programmstart:
1. 0
2. 0
3. 0
4. 0
5. 0
Jetzt die *.txt-Datei nach dem ersten Programmstart (beim ersten Mal funktioniert immer alles, es wurden 4 Punkte erzielt) :
1. 4
2. 0
3. 0
4. 0
5. 0
Jetzt die *.txt-Datei nach dem zweiten Programmstart (jetzt funktioniert es nicht mehr, es wurden 2 Punkte erzielt) :
1. 4
2. 0
3. 0
4. 0
5. 0
Wenn ich die *.txt-Datei wieder auf 0 setze wie am Anfang, dann gehts wieder einmal. Dem Rückgabewert von fprintf() zufolge werden alle Zeichen übertragen, nur tut sich ab dem zweiten Mal eben nichts mehr.
Lg
-
27.09.11 12:29 #17
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Das kann ich so nicht nachvollziehen.
Folgendes Programm:liefert folgende Ausgabe:Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
void show_highscore() { FILE* f = fopen("Snake_Highscore.txt", "r"); if (f) { char buf[50]; while (fgets(buf, sizeof(buf), f)) fputs(buf, stdout); fclose(f); } } int main() { show_highscore(); highscoreabfrage(4); show_highscore(); highscoreabfrage(2); show_highscore(); }
Bei wiederholtem Aufruf:Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
1. 0 2. 0 3. 0 4. 0 5. 0 5 Gratulation! Du hast im Highscore den 1.Platz erreicht! 1. 4 2. 0 2. 0 2. 0 2. 0 5 Gratulation! Du hast im Highscore den 2.Platz erreicht! 1. 4 2. 2 3. 0 2. 0 2. 0
Falls du meintest, dass es nur bei dir im Programm nicht funktioniert, dann liegt es offenbar nicht an der Funktion, sondern an irgendwelchem anderem Code deines Programms. Gibt es denn noch andere Stellen in deinem Programm wo du auf diese Datei zugreifst?Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
1. 4 2. 2 3. 0 2. 0 2. 0 5 Gratulation! Du hast im Highscore den 2.Platz erreicht! 1. 4 2. 4 3. 2 3. 0 3. 0 5 Gratulation! Du hast im Highscore den 4.Platz erreicht! 1. 4 2. 4 3. 2 4. 2 5. 0
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Nun ja wenn ich die Funktion alleine in ein Programm umwandle funktioniert es eben auch nicht. Das verwundert mich ja. Aber wenn es an den Aufrufen nicht liegt und dieselbe Funktion bei dir funktioniert, an was kann es dann scheitern?
Lg
-
27.09.11 21:26 #19
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Dein Programm funktioniert bei mir komischerweise auch nicht. Es funktioniert wie immer nur beim ersten Mal.
Lg
-
28.09.11 22:25 #21
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Ich hatte das Programm (aus Bequemlichkeit) nur unter Linux getestet. Unter Windows gestartet schlägt es bei mir ebenfalls fehl.
Das ist scheint ja schon etwas merkwürdig. Allerdings dämmerte es mir ein wenig, und nach etwas Suche...
Der C Standard verlangt bei Dateien welche zum Lesen und Schreiben geöffnet sind, das zwischen Lese- und Schreibvorgängen entweder ein fflush bzw. ein fseek erfolgen muss.
Siehe z.B. http://www.lysator.liu.se/c/c-faq/c-11.html#11-10
Also, wenn du etwas mit fgets liest und danach fprintf aufrufen willst, solltest du dazwischen z.B.
aufrufen.Code c:1
fseek(scores, 0, SEEK_CUR);
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Vielen Dank jetzt funktioniert es!
Das erklärt dann auch warum es nur beim ersten Durchlauf geklappt hat
Und ich hab wieder was neues gelernt
Lg
Ähnliche Themen
-
Formatierung mit fprintf und Wertebereich für Fibonacci?
Von tobbbbi im Forum C/C++Antworten: 17Letzter Beitrag: 24.11.08, 10:54 -
C++: fprintf problem mit linux
Von tomekk228 im Forum C/C++Antworten: 17Letzter Beitrag: 06.08.08, 19:03 -
Unterschiedliche fprintf ausgabe
Von banes im Forum VisualStudio & MFCAntworten: 2Letzter Beitrag: 10.10.07, 17:24 -
fprintf Problem
Von glenda im Forum C/C++Antworten: 1Letzter Beitrag: 20.08.07, 17:42 -
zeigt nichts an....
Von Precog im Forum Flash PlattformAntworten: 5Letzter Beitrag: 10.09.02, 19:48



2Danke

Zitieren

Login






