2016-08-30 15 views
-1

Ich lese eine CSV-Datei mit C und möchte die Token von strtok() in einem Array speichern. Irgendwie, wenn die CSV-Datei mehrere Zeilen hat, bekomme ich nicht die korrekte Ausgabe der Token. Die CSV-Datei sieht wie folgt aus (nur zwei Linien für dieses Beispiel wird die reale Datei mehr als 100 Zeilen hat):strtok() nicht korrekt drucken

abc,def,ghi 

jkl,mno 

Mein Code ist:

void main() { 



    FILE *fp; 
    fp = fopen("simple.csv", "r"); 
    const char s[2] = ","; 
    char *token; 
    char *out[5]; 
    int i = 0; 
    if (fp != NULL) 
    { 
     char line[50]; 
     while (fgets(line, sizeof line, fp) != NULL) 
     { 
      token = strtok(line, s); 

      //for (token; token != NULL; token = strtok(NULL, ",")) 
      while (token != NULL) 
      { 
       out[i++] = token; 
       //printf("%s", token); 
       token = strtok(NULL, s); 

      } 

      printf("%s\n", out[0]); 

     } 

     //for (i = 0; i < 5; i++) 


     fclose(fp); 
    } 
    else { 
     printf("error opening file"); 
    } 
} 

ich jede will Komma Zeichenfolge abgegrenzt in einem Array durch eine Schleife gespeichert werden. Wenn ich das erste Element des Arrays ausdrucken (out[0]), der Ausgang ist:

abc 

jkl 

, während ich es nur das Token zu erwarten:

abc

Kann jemand mir bitte lassen Wissen Sie, was das Problem ist?

+2

Sie verwenden die * gleichen * 'line' Puffer für * alle *' fgets'. Natürlich werden die Ergebnisse in jeder Eingabezeile überschrieben. – kaylum

+0

Ich bin ein Neuling. Kannst du mir bitte sagen, wie ich das lösen soll? –

+0

ja, das sind die ersten Spalten. Ich möchte jede Zeichenfolge in der CSV-Datei in einem Array speichern. –

Antwort

1

Das Problem ist, dass strtok Zeiger zurückgibt, die auf mehrere Stellen von line zeigen, deren Inhalte sich ständig ändern.

Sie müssen also den Inhalt des Tokens kopieren und nicht nur Zeiger zuweisen.

Zum Beispiel definieren out zu sein:

char out[5][10]; // max of 5 words, each of 10 chars max (including \0) 

und innerhalb der Schleife:

strcpy(&out[i++][0], token);