2016-08-30 5 views
-1

C言語のCSVファイルを読み込み、strtok()のトークンを配列に格納したいとします。どういうわけか、CSVファイルに複数の行がある場合、私は正しいトークン出力を得られません。 CSVファイルは次のようになります(この例ではわずか2行、実際のファイルには、100個の以上の行を持つことになります):strtok()が正しい値を出力しない

abc,def,ghi 

jkl,mno 

私のコードは次のとおりです。私は、文字列をカンマ区切りごとをしたい

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

ループを介して配列に格納することができます。 私は配列(out[0])の第一の要素を印刷すると、出力は次のとおりです。

abc 

jkl 

私はそれだけのトークンであることを期待しながら、:

ABC

誰も私を聞かせてくださいすることができ問題が何であるか知っていますか?

+2

あなたは*すべての* 'fgets'用*同じ*' line'バッファを使用しています。もちろん結果はすべての入力行に上書きされます。 – kaylum

+0

私は初心者です。これを解決する方法を教えてくださいできますか? –

+0

はいこれは最初の列です。私はCSVファイルの各文字列を配列に格納したいと思います。 –

答えて

1

strtokは、内容が常に変化するlineのいくつかの場所を指すポインタを返します。

したがって、ポインタを割り当てるだけでなく、トークンのコンテンツをコピーする必要があります。例えば

、ことoutを定義します。

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

とループ内:

strcpy(&out[i++][0], token); 
関連する問題