2017-12-31 80 views
1

Ich versuche, einige Highscores eines Spiel auf diese Art von Struktur zu laden:C - Probleme mit strtok

typedef struct{ 
    char date_time[20]; 
    int record_minutes; 
    int record_seconds; 
    int plays; 
} Highscore; 

Das Highscores in einer TXT-Datei gespeichert werden, etwa so: „nrplays Minuten Sekunden date_and_time“

z 15 2 10 31/12/2017-23:00:20

Das erste Bit des Codes ich die Datei lesen bin mit (nur 3 Zeilen hat, deshalb habe ich nicht eine Schleife erstellt haben) ist die folgende

void loadHighscores(){ 

    FILE *f; 

    if (check_ifEmptyFile()==-3) 
      return; 

    f=fopen("highscores.txt", "r"); 

    char linha[30]; 
    char *token; 

    High1 = (Highscore *)malloc(sizeof(Highscore)); 

    fgets(linha, 30, f); 
    printf("linha: %s", linha); 

    token = strtok(linha, " \n"); 
    High1->plays=atoi(token); 
    printf("%d\n", High1->plays); 

    token = strtok(NULL, linha); 
    High1->record_minutes=atoi(token); 
    printf("%d\n", High1->record_minutes); 

    token = strtok(NULL, linha); 
    High1->record_seconds=atoi(token); 
    printf("%d\n", High1->record_seconds); 

    token = strtok(NULL, linha); 
    snprintf(High1->date_time, 20*sizeof(char), "%s",token); 
    printf("%s",High1->date_time); 
} 

Der Ausgang war

linha: 15 2 10 31/12/2017-23:00:20 
15 
2 
0 
/

was bedeutet, dass strtok nicht tut, was ich vorhatte. Irgendwelche Tipps?

anzumerken, dass High1 zuvor definiert wurde, ist die malloc nicht falsch, und auch, dass High1->date_time sollte der gesamte 31/12/2017-23: 00: 20-String.

+3

Vorausgesetzt, der Prototyp für strtok ist 'char * strtok (char * str, const char * delim);' Sie verwenden die Funktion nicht richtig: der zweite Parameter sollte die Trennzeichen sein. – fvu

+0

Sie sollten wahrscheinlich etwas anderes als 'linha' in' token = strtok (NULL, linha); '- wahrscheinlich' "\ n" 'verwenden, wenn die anderen Vorkommnisse etwas sind. Die Verwendung von 'strtok()' ist schwierig. vermeide es, wenn du kannst. –

+0

In den Zeilen 'FILE * f' gibt es eine böse Vernetzung. if (check_ifEmptyFile() == - 3) zurückgeben; f = fopen ("highscores.txt", "r"); '- Um einen Sinn zu haben, muss' check_ifEmptyFile() 'auch den Dateinamen' "highscores.txt" 'kennen und benutzen. Reduzieren Sie die Kopplung; Übergeben Sie Dateinamen an Funktionen, an denen sie arbeiten können. Das gilt für die Funktion 'loadHighScores()'; Es sollte wahrscheinlich der Dateiname gegeben werden, um zu arbeiten. –

Antwort

2

In strtok() sollte der zweite Parameter das Delimeter sein. Also, in Ihrem Fall sollte der Zeichenraum sein: ''.

token = strtok(linha, " "); 

und für aufeinanderfolgende Aufrufe:

token = strtok(NULL, " "); 

, wo Sie jede Zeile in linha Parsen.

+1

Der Code in der Frage verwendet '" \ n "' Leerzeichen-Newline; das könnte auch angebracht sein. –