2016-08-30 3 views
-1

Je lis un fichier CSV avec C et je veux stocker les jetons de strtok() dans un tableau. D'une manière ou d'une autre, quand le fichier CSV a plusieurs lignes, je n'obtiens pas la sortie correcte des jetons. Le fichier CSV ressemble à ceci (seulement deux lignes pour cet exemple, le fichier réel aura plus de 100 lignes):strtok() n'imprime pas la valeur correcte

abc,def,ghi 

jkl,mno 

Mon code est:

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"); 
    } 
} 

Je veux chaque virgule délimitée par une chaîne à être stocké dans un tableau à travers une boucle. Quand j'imprimer le 1er élément du tableau (out[0]), la sortie est:

abc 

jkl 

alors que je pensais que ce serait juste le jeton:

abc

Quelqu'un peut-il s'il vous plaît laissez-moi savoir quel est le problème?

+2

Vous utilisez le * même * 'tampon pour * chaque coût média *' fgets'. Alors, bien sûr, les résultats sont écrasés à chaque ligne d'entrée. – kaylum

+0

Je suis un débutant. pouvez-vous s'il vous plaît dites-moi comment résoudre ce problème? –

+0

oui ce sont les premières colonnes. Je voudrais stocker chacune des chaînes dans le fichier CSV dans un tableau. –

Répondre

1

Le problème est que strtok renvoie des pointeurs pointant vers plusieurs endroits de line, dont le contenu change tout le temps.

Ainsi, vous devez copier le contenu du jeton, pas seulement assigner des pointeurs.

Par exemple, définir out être:

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

et à l'intérieur de la boucle:

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