String splitten und zweiten Teil konvertieren



  • Ich habe es einfach so übertragen.

    Filehighscore = fopen("highscore.txt","r");
                        zaelen = 0;
                        while(2 == fscanf(Filehighscore, "%s255s %d", test, &score))
                        {
                            printf("%s %d\n", test, score);
                        }
    

  • Mod

    audacity363 schrieb:

    "%s255s %d"
    

    Das solltest du noch einmal überdenken.



  • gut habe es jetzt so gemacht:

    printf("Dein Highscore: %d\n\n", highscore);
                        Filehighscore = fopen("highscore.txt","r+");
                        zaelen = 1;
                        while(2 == fscanf(Filehighscore, "%s %d", test, &score))
                        {
                             if(score < highscore || score == highscore)
                                {
                                    printf("Du hast den %d gemacht.\n", zaelen);
                                    printf("Gebe bitte deinen Namen ein: ");
                                    scanf("%s", &name);
                                    printf("%s\n\n", name);
                                 //fprintf(Filehighscore, "%s %d", name, highscore);
                                    break;
                                }
                                else
                                {
                                    zaelen++;
                                }
    
                        }
    

    Habe jetzt noch ein Problem mit dem beschreiben von der Datei. Soll ich dafür ein neuen Thread erstellen oder können wir das auch hier machen?
    Wenn es aucch hier geht folgendes:
    Den fprintf Befehl den ich oben als Kommentar eingefügt habe wird irgendwie nicht beachtet. Also es wird nichts in die Datei geschrieben. Der Combiler gibt aber auch keine Fehler oder Warnungen aus. Der Debuger nimmt ihn so hin gibt aber keine Informationen aus.



  • When a file is opened with update mode ('+' as the second or third character in the
    above list of mode argument values), both input and output may be performed on the
    associated stream. However, output shall not be directly followed by input without an
    intervening call to the fflush function or to a file positioning function (fseek,
    fsetpos, or rewind), and input shall not be directly followed by output without an
    intervening call to a file positioning function, unless the input operation encounters endof-
    file. Opening (or creating) a text file with update mode may instead open (or create) a
    binary stream in some implementations.

    soviel dazu, warum du nichts siehst.
    selbst wenn du etwas siehst wirst du in den meisten fällen
    nicht gerade freudig gestimmt sein, was du zu sehen bekommst.

    - nach dem einlesen zeigt der dateizeiger hinter den gerade eingelesenen
    datensatz. dort möchtest du den höheren wert vermutlich nicht haben.
    - selbst wenn du die richtige stelle per fseek etc ansteuerst, wird der neu einzufügende datensatz in den meisten fällen nicht die größe des zu überschreibenden haben. das sieht dann wirklich nicht schön aus

    abhilfe in groben zügen:

    datei komplett in den speicher einlesen, datei schließen.
    datei im speicher zum schreiben vorbereiten(neuer highscore etc)
    datei neu- bzw. überschreiben.



  • ok habe da ganze wieder mit ifs gelöst :)Sehe sonst keine Möglichkeit die Einzelnen Zeilen zu zählen und aufzureiben.

    while(2 == fscanf(Filehighscore, "%s %d", user, &score))
                        {
                            if(zaelen == 0)
                            {
                                strcpy(uZeile1, user);
                                hZeile1 = score;
                                printf("user Zeile1: %d\n", hZeile1);
                            }
    
                            if(zaelen == 1)
                            {
                                strcpy(uZeile2, user);
                                hZeile2 = score;
                                printf("user Zeile2: %d\n", hZeile2);
                            }
    
                            if(zaelen == 2)
                            {
                                strcpy(uZeile3, user);
                                hZeile3 = score;
                                printf("user Zeile2: %d\n", hZeile3);
                            }
                            zaelen++;
    


  • Wenn du die Variablen uZeile und hZeile als Array anlegst, kannst du das viel eleganter lösen.



  • früher oder später kommst du auch an strukturen nicht vorbei.

    #define NAMELEN_MAX 63
    
    	struct scorelist_dataset
    	{
    		char name[NAMELEN_MAX+1];
    		unsigned score;
    	};
    
    	struct scorelist_dataset dataset[3] = {0};
    	int i = 0;
    
    	fscanf ( fp, "%s %u", dataset[i].name, &dataset[i].score )
    	printf( "%s %u\n", dataset[i].name, dataset[i].score );
    


  • Habe es jetzt so gelöst und es funktioniert.

    Filehighscore = fopen("highscore.txt","r+");
                        zaelen = 0;
                        platz = 0;
    
                        while(2 == fscanf(Filehighscore, "%s %d", user, &score))
                        {
                            if(zaelen == 0)
                            {
                                strcpy(uZeile1, user);
                                hZeile1 = score;
                                if(hZeile1 <= highscore && platz == 0)
                                {
                                    printf("Du hast den ersten Platz gemacht. Gebe bitte deinen Namen ein: ");
                                    scanf("%s", name);
                                    printf("Du kannst die Highscore Liste im Menue unter dem dritten Punkt aufrufen\n");
                                    strcpy(uZeile1, name);
                                    hZeile1 = highscore;
                                    platz = 1;
                                }
                            }
    
                            if(zaelen == 1)
                            {
                                strcpy(uZeile2, user);
                                hZeile2 = score;
                                if(hZeile2 <= highscore && platz == 0)
                                {
                                    printf("Du hast den zweiten Platz gemacht. Gebe bitte deinen Namen ein: ");
                                    scanf("%s", name);
                                    printf("Du kannst die Highscore Liste im Menue unter dem dritten Punkt aufrufen\n");
                                    strcpy(uZeile2, name);
                                    hZeile2 = highscore;
                                    platz = 1;
                                }
    
                            }
    
                            if(zaelen == 2)
                            {
                                strcpy(uZeile3, user);
                                hZeile3 = score;
                                if(hZeile3 <= highscore && platz == 0)
                                {
                                    printf("Du hast den dritten Platz gemacht. Gebe bitte deinen Namen ein: ");
                                    scanf("%s", name);
                                    printf("Du kannst die Highscore Liste im Menue unter dem dritten Punkt aufrufen\n");
                                    strcpy(uZeile3, name);
                                    hZeile3 = highscore;
                                    platz = 1;
                                }
                                if(platz = 0)
                                {
                                    printf("Du hast gar keinen Platz gemacht\n");
                                }
                            }
                            zaelen++;
                        }
                               fclose(Filehighscore);
                            neuFilehighscore = fopen("highscore.txt", "w+");
                            if(neuFilehighscore == NULL)
                            {
                                printf("Fehler beim anlegen der highscore.txt.\n");
                            }
                            fprintf(neuFilehighscore, "%s %d\n", uZeile1, hZeile1);
                            fprintf(neuFilehighscore, "%s %d\n", uZeile2, hZeile2);
                            fprintf(neuFilehighscore, "%s %d\n", uZeile3, hZeile3);
                            fclose(neuFilehighscore);
    
                    }
    


  • Ganz schlechte Praxis, kopierten Code zu verwenden.
    Aber du willst es trotz hier vielfach gegebener Hinweise nicht anders.

    if(platz = 0)
    

    ist auch noch ein Fehler und wahrscheinlich nicht der letzte in deinem Programm.



  • Ja ich habe die Dritte Seite nicht gesehen 🙂 Habe es jetzt mit deiner Lösung versucht und es funktioniert.
    Vielen Dank für den netten Support.


Anmelden zum Antworten