tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
ERLEDIGT
JA
ANTWORTEN
21
ZUGRIFFE
503
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    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
     

  2. #17
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Das kann ich so nicht nachvollziehen.

    Folgendes Programm:
    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();
    }
    liefert folgende Ausgabe:
    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
    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. 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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #18
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    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
     

  4. #19
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von ibafluss Beitrag anzeigen
    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?
    Was kommt denn bei dir für mein Test-Programm heraus?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #20
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Dein Programm funktioniert bei mir komischerweise auch nicht. Es funktioniert wie immer nur beim ersten Mal.

    Lg
     

  6. #21
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.
    Code c:
    1
    
    fseek(scores, 0, SEEK_CUR);
    aufrufen.

    Gruß
    ibafluss bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #22
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    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

  1. Antworten: 17
    Letzter Beitrag: 24.11.08, 10:54
  2. C++: fprintf problem mit linux
    Von tomekk228 im Forum C/C++
    Antworten: 17
    Letzter Beitrag: 06.08.08, 19:03
  3. Unterschiedliche fprintf ausgabe
    Von banes im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 10.10.07, 17:24
  4. fprintf Problem
    Von glenda im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 20.08.07, 17:42
  5. zeigt nichts an....
    Von Precog im Forum Flash Plattform
    Antworten: 5
    Letzter Beitrag: 10.09.02, 19:48