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

  2. #2
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    Zitat Zitat von ibafluss Beitrag anzeigen
    Nur ab dem zweiten mal abspeichern funktioniert das oben genannte fprintf() nicht
    Was genau meinst Du damit?
    Ist "scores" nicht gefüllt? Wird der Teil überhaupt durchlaufen?

    Davon abgesehen sind an der Stelle Deine Variablen j und cou Integer-Werte und sollten somit besser mit %i formatiert werden, nicht mit %d !!

    Gruß
    Klaus
    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 !!

  3. #3
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Du solltest die score am Ende des Programmes mit fclose(score) schliessen, sonst wird gar nichts auf die Platte geschrieben.

    Gruss
    cwriter
     
    Intel 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

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

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von ibafluss Beitrag anzeigen
    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.
    Mach am besten ein vollständiges Minimalprogramm, wo man den Fehler nachvollziehen kann.
    Zitat Zitat von ibafluss Beitrag anzeigen
    Ich schreibe für Integer immer %d. Was ist denn genau der Unterschied zwischen %d und %i?
    Es gibt keinen (bei printf).

    Gruß
    Geändert von deepthroat (22.09.11 um 16:42 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Was meinst du jetzt genau?

    Die Funktion in ein eigenes Programm packen?
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von ibafluss Beitrag anzeigen
    Was meinst du jetzt genau?

    Die Funktion in ein eigenes Programm packen?
    Ja, ein vollständiges, kompilierbares Programm erstellen.

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

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

  9. #9
    portus portus ist offline Grünschnabel
    Registriert seit
    Sep 2011
    Beiträge
    2
    Zitat Zitat von ibafluss Beitrag anzeigen
    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.
    ICH ( meine Meinung ) würde so etwas serialisieren. Kann man wunderbar mit Boost machen ...
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von ibafluss Beitrag anzeigen
    Hab ich gemacht und hier gibt mir fprintf() als Rückgabewert -1 zurück. Ich weiß jedoch nit, was falsch ist.
    Zeig das Programm und ggf. den Aufruf desselbigen.
    Zitat Zitat von ibafluss Beitrag anzeigen
    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.
    Dann hast du entweder einen Fehler im Programm oder deine Diagnose ist fehlerhaft. Probiere das Programm soweit zu minimieren so dass der Fehler immer noch auftritt und stelle es hier rein.

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

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

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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ß
    ibafluss bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

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

  14. #14
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Wenn ich die überschreibe schreibt er ja einfach weiter in der Zeile oder?
    Ja. Mit dem w Modus überschreibt er alles. Wenn du eine Datei einmal mit "w" öffnest und wieder schliesst, ist der Inhalt weg.

    cwriter
     
    Intel 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

  15. #15
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von ibafluss Beitrag anzeigen
    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").
    Zitat Zitat von ibafluss Beitrag anzeigen
    Mit Zeilenendemarkierungen meinst du ja die '\n' oder? Wenn ich die überschreibe schreibt er ja einfach weiter in der Zeile oder?
    Ja.
    Zitat Zitat von ibafluss Beitrag anzeigen
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ä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