fprintf() tut nichts

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:
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;
    }
}
 
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ß
 
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.
 
Also ich habe die *.txt-Datei bereits mit den Highscores gespeichert, nur alle auf 0 gesetzt.
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").
Mit Zeilenendemarkierungen meinst du ja die '\n' oder? Wenn ich die überschreibe schreibt er ja einfach weiter in der Zeile oder?
Ja.
Ja, ich würde es aber gerne so mal probieren nur zu Übungszwecken.
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ß
 
Also hier die Funktion:

Code:
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
 
Hi.

Das kann ich so nicht nachvollziehen.

Folgendes Programm:
C++:
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();
}
liefert folgende Ausgabe:
Code:
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
Bei wiederholtem Aufruf:
Code:
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
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?

Gruß
 
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
 
Zurück