2013-02-07 4 views
1

의 끝 부분에 빈 문자열을 읽기 :strtok를 내가처럼 보이는 파일에서 코드의 라인을 구문 분석 strtok를을 사용하여 아래의 내 코드에 라인

1023.89,863.19 1001.05,861.94 996.44,945.67 1019.28,946.92 1023.89,863.19 

파일이 서로 다른 길이의 라인을 가지고 수 있듯이 나는 돈 fscanf를 사용하지 마십시오. 아래의 코드는 하나의 작은 결함을 제외하고는 작동합니다. 너무 많은 시간 동안 루프를 돌리고 널 빈 토큰을 다시 루핑하기 전에 긴 빈 문자열을 읽거나 while 루프를 빠져 나간다. 왜 이것이 될 수 있는지 모르겠습니다.

도움을 주시면 감사하겠습니다.

fgets(line, sizeof(line), some_file);  
while ((line != OPC_NIL) { 
    token = strtok(line, "\t"); //Pull the string apart into tokens using the commas 
    input = op_prg_list_create(); 
    while (token != NULL) { 
     test_token = strdup(token); 
     if (op_prg_list_size(input) == 0)  
      op_prg_list_insert(input,test_token,OPC_LISTPOS_HEAD); 
     else 
      op_prg_list_insert(input,test_token,OPC_LISTPOS_TAIL); 
     token = strtok (NULL, "\t"); 
    } 
    fgets(line, sizeof(line), some_file);     
} 

답변

2

구분 기호의 올바른 목록을 사용해야합니다. 당신이 쉼표로 토큰을 분리 "," 대신 "\t"을 사용하려면

token = strtok(line, "\t"); //Pull the string apart into tokens using the commas 

: 코드는 의견을 모순. 또한, 토큰에 개행 문자 \n (파일에서 읽은 각 행의 끝에 fgets이 표시됨)을 포함시키지 않으려 고합니다. 그래서 구분 기호 목록에 개행 문자를 추가

token = strtok(line, ",\n"); //Pull the string apart into tokens using the commas 
... 
token = strtok (NULL, ",\n"); 

당신은 너무 구분 기호 목록에 공백 문자를 추가 할 수 있습니다 (863.19 1001.05 단일 토큰 또는 두 개의 토큰 당신이 마지막에 공백을 제거 하시겠습니까? 라인?).

0

sizeof(line)을 사용하면 line은 스택에 고정 크기 배열로 나타납니다. 이 경우 (line != OPC_NIL)은 결코 false이 아닙니다. 그러나 fgets()은 파일 끝에 도달하거나 다른 오류가 발생하면 NULL을 반환합니다.

while(fgets(line, sizeof(line), some_file)) { 
... 
} 

귀하의 입력 파일 가능성도 마지막에 하나의 빈 줄의 결과로 마지막 입력 라인의 끝에 개행 문자가 있습니다로 외부 동안 루프를 다시 작성해야합니다.

1023.89,863.19 1001.05,861.94 996.44,945.67 1019.28,946.92 1023.89,863.19↵ 
<blank line> 

이 : 당신이 while 루프에서 수행해야

1023.89,863.19 1001.05,861.94 996.44,945.67 1019.28,946.92 1023.89,863.19 

우선 문자열이 원하는 형식으로 실제로 있는지 확인 인이이 사이의 차이입니다. 깨지지 않는 경우 :

while(fgets(line, sizeof(line), some_file)) { 
    if(strlen(line) == 0) // or other checks such as "contains tab characters" 
     break; 
    ... 
}