-
Hey Leute!
Bin grad dabei was zu schreiben, in dem dann auch Daten in einer *.txt-Datei gespeichert werden. Es handelt sich darum, dass ein Highscore gespeichert wird.
Hier der Code:
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
void highscoreabfrage (int cou, FILE *scores) { int i, a, highscore, j, s_wert; // 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 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); } fprintf (scores, "%d. %d\n", j+1, cou); // Der neue Wert wird an der passenden Stelle eingefügt und die Highscore wird überschrieben 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); } return; } } printf ("\nSie haben es leider nicht in die Highscore geschafft ...\n\n"); return; } }
Das Problem ist das fprintf() in der 34.Zeile. Wenn die Highscore auf 0 ist und man also quasi das erste Mal spielt, funktioniert alles bestens und man ist dann logischerweise erster. Nur ab dem zweiten mal abspeichern funktioniert das oben genannte fprintf() nicht. Ich habe auch einmal ein system("pause") direkt nach dem fprintf() geschrieben, um nachzusehen ob das fprintf() wirklich nichts tut und es ist so.
Weiß jemand was da zu machen ist?
Lg: Ibafluss
-
22.09.11 07:47 #2
Geändert von vfl_freak (22.09.11 um 07:48 Uhr) Grund: Grammatik :-)
Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!
Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
-------------------------------------------------------------------------------------------------
Ich beantworte keine Fragen per PN !!
Stellt Eure Fragen im Forum - dann haben alle etwas davon !!
-
Du solltest die score am Ende des Programmes mit fclose(score) schliessen, sonst wird gar nichts auf die Platte geschrieben.
Gruss
cwriterIntel inside - Idiot outside :-)
Ich schreibe in C und bin Anfänger.
______________________________
Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
Danke
-
vfl_freak: Das fprintf wird durchlaufen und dem Rückgabewert von fprintf zufolge sollte auch alles richtig passiert sein. Trotzdem ändert sich in der *.txt-Datei nichts.
Ich schreibe für Integer immer %d. Was ist denn genau der Unterschied zwischen %d und %i?
cwriter: Also ob ich das fclose schreibe oder nicht, macht keinen Unterschied, da am Ende des Programmes ja der ganze reservierte Speicher wieder freigegeben wird. Außerdem funktioniert es ja das 1.Mal.
-
22.09.11 16:39 #5
- 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.
-
Was meinst du jetzt genau?
Die Funktion in ein eigenes Programm packen?
-
22.09.11 16:54 #7
- 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.
-
Hab ich gemacht und hier gibt mir fprintf() als Rückgabewert -1 zurück. Ich weiß jedoch nit, was falsch ist.
Wenn ich im normalen Programm den Rückgabewert ausgebe, bekomme ich 5 zurück, das ist korrekt. Nur befindet sich im Programm und in dem neuen Programm von der Funktion derselbe Inhalt.
-
-
22.09.11 22:07 #10
- 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.
-
Also ich muss mich korrigieren ich bekomme von fprintf() immer als Rückgabewert 5 und das ist korrekt, da 5 Zeichen übertragen werden sollten. Nur werden sie eben nicht übertragen. Ich hab auch gleich nach fprintf() das Programm mit system("pause") angehalten und hab di *.txt-Datei geöffnet, da ich vermutet hatte, dass das geänderte überschrieben wird, aber auch das war nicht der Fall.
Hier ist der Quellcode, es geht darum, dass eine Highscore an der richtigen Stelle gespeichert wird:
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
void highscoreabfrage (int cou, FILE *scores) { 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 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; } }
-
24.09.11 22:01 #12
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Ich hab mir deine Funktion nochmal genauer angesehen.
Das kann so nicht funktionieren.
Du scheinst davon auszugehen, dass eine Datei zeilenweise gespeichert ist. Das ist aber nicht der Fall.
Wenn du etwas schreibst wird ab der Position alles andere mit dem neuen Inhalt überschrieben. Auch Zeilenendemarkierungen! Du überschreibst damit evtl. bereits etwas aus der nächsten Zeile und somit Informationen über die anderen Scores.
Weiterhin ist es etwas komisch, das du scores als Parameter an die Funktion übergibst und den Parameter gar nicht verwendest, sondern die Datei in der Funktion öffnest und schließt. Wobei du das Schließen vergisst wenn j == 5 ist.
Am einfachsten wäre es die Datei erstmal komplett in ein Array zu lesen und dann im "w" Modus zu öffnen und alle Informationen neu reinzuschreiben.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Also ich habe die *.txt-Datei bereits mit den Highscores gespeichert, nur alle auf 0 gesetzt.
Mit Zeilenendemarkierungen meinst du ja die '\n' oder? Wenn ich die überschreibe schreibt er ja einfach weiter in der Zeile oder?
Ups danke habe ich übersehen.
Ja, ich würde es aber gerne so mal probieren nur zu Übungszwecken.
-
Ja. Mit dem w Modus überschreibt er alles. Wenn du eine Datei einmal mit "w" öffnest und wieder schliesst, ist der Inhalt weg.Wenn ich die überschreibe schreibt er ja einfach weiter in der Zeile oder?
cwriterIntel inside - Idiot outside :-)
Ich schreibe in C und bin Anfänger.
______________________________
Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
Danke
-
25.09.11 22:08 #15
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Mach doch endlich ein vollständiges Beispielprogramm, inklusive der Datei wie sie vorher aussieht, wie du die Funktion aufrufst und wie die Datei danach aussieht. Damit fängt eine Problembeschreibung an - nicht mit der Diagnose ("fprintf tut nichts").
Ja.
Dann mußt du dafür sorgen, dass du nicht die nachfolgenden Zeilen überschreibst. Dazu müßtest du alle folgenden Zeilen auslesen und speichern, bevor du die aktuelle Zeile überschreiben kannst.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ä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






