String splitten und zweiten Teil konvertieren



  • Nein arbeite schon etwas länger mit C aber nicht mit sscanf. Dies ist mir bis jetzt noch nicht untergekommen. Mach zurzeit eine Ausbildung zum Fachinformatiker und in diesem Betrieb wird sehr viel mit C gearbeitet. Aber scho nmal vielen dank.
    Habe es jetzt so gelöst und es funktioniert:

    printf("Dein Highscore: %d\n\n", highscore);
                        Filehighscore = fopen("highscore.txt","r");
                        zaelen = 0;
                        while ( fgets(score, LINE_LENGTH, Filehighscore) != NULL)
                        {
                            if(zaelen == 0)
                            {
                                zahl2 = strtok(score, " ");
                                zahl2 = strtok(NULL, " ");
                                umwandel = atoi(zahl2);
                                printf("%d\n", umwandel);
                                if(umwandel < highscore || umwandel == highscore)
                                {
                                    printf("Du hast den ersten Platz gemacht.\n");
                                    platz = 1;
                                }
    
                            }
    
                            if(zaelen == 1)
                            {
                                zahl2 = strtok(score, " ");
                                zahl2 = strtok(NULL, " ");
                                umwandel = atoi(zahl2);
                                printf("%d\n", umwandel);
                                if(umwandel < highscore)
                                {
                                    printf("Du hast den zweiten Platz gemacht.\n");
                                }
                                else
                                {
                                    printf("Du hast den dritten Platz gemacht\n");
                                }
                            }
    
                            if(zaelen == 2)
                            {
                                zahl2 = strtok(score, " ");
                                zahl2 = strtok(NULL, " ");
                                umwandel = atoi(zahl2);
                                printf("%d\n", umwandel);
                                if(umwandel < highscore)
                                {
                                    printf("Du hast den dritten Platz gemacht.\n");
                                }
                                else
                                {
                                    printf("Du hast gar keinen Platz gemacht\n");
                                }
                            }
                          zaelen++;
    

    Es ist noch nicht ganz ausgereift bzw. es müssen ein paar Funktionen noch verändert werden.

    Die Highscore.txt sieht so aus:
    Test1 30
    Test2 20
    Test3 10

    ohne irgendwelche anderen Sachen.



  • Guck dir doch auch mal die Funktion fscanf bzw. fscanf_s an.

    char test[256];
    unsigned score;
    
    while ( 2 == fscanf ( Filehighscore, "%255s %d", test, &score ))
    {
    	printf ( "%s %d\n", test, score );
    }
    


  • Ok habe es jetzt mal mit fscanf versucht nur gibt er dort einen total anderen Wert zurück und zwar 36. Laut Debugger steht dann auch in test nur Platzhalter drinnen aber nichts von Test1 oder 30.



  • dann hast du es wohl falsch versucht.
    zeig doch mal deinen versuch, dann wissen wir mehr, so kann man nur rätseln was du falsch machst.



  • 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