2016-08-30 7 views
-1

C로 CSV 파일을 읽고 strtok()의 ​​토큰을 배열에 저장하려고합니다. 여하튼, CSV 파일에 여러 줄이있을 때 올바른 토큰 출력을 얻지 못합니다. CSV 파일은 다음과 같습니다 (이 예를 들어 그냥 두 줄, 실제 파일은 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의 여러 위치를 가리키는 포인터를 반환합니다.

따라서 포인터를 지정하는 것뿐만 아니라 토큰의 내용을 복사해야합니다.

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

를 루프 내부 :

예를 들어, out이되도록 정의

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