2017-09-07 36 views
1

한 줄에는 정수로 읽을 임의의 숫자가있는 파일이 있습니다.파일의 한 줄에서 공백으로 구분 된 임의의 수의 문자 읽기

1 2 3 4 

그때 fgets을 사용하려고하고 strtok이 달성하기 : 최소한의 재현성 예에서, 난 단지 다음 줄이 포함 된 파일 test.dat 만들어

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(){ 

FILE* fileptr; 

fileptr = fopen("test.dat","r"); 
char line[500]; 
char *token; 

int array[20]; 
int i = 0; 

fgets(line,300,fileptr); 

token = strtok(line," "); 
array[i] = atoi(token); 
printf("%d\n", array[i]); 
i++; 

while(token != NULL){ 
    token = strtok(line," "); 
    array[i] = atoi(token); 
    printf("%d\n", array[i]); 
    i++; 
} 

return 0; 
} 

을하지만이 인쇄 결과 1의 21 라인, 0의 632 라인이 뒤 따른다. 마지막으로 i이 20보다 커지고 할당 된 공간이 array이므로 세그먼트 화 오류가 발생합니다. 내가 이해할 수없는 것은 600+ 라인이 인쇄되는 이유이며, 파일에서 숫자 1 이상을 읽을 수없는 이유입니다. 내가 뭘 놓치고 있니?

참고 : 전체 파일을 읽는 기존 서브 루틴을 간단하게 수정하기 때문에 fgets으로 파일을 계속 읽는 것이 좋습니다.

+0

흠, 불분명 한 이유는 fgets (라인 300, fileptr)'300;'. 'fgets (line, sizeof line, fileptr);을 기대할 것입니다. – chux

+0

@chux 옳지 않은 이유는 - 그 라인이 어디에서 왔는지 원래 코드를 쓰지 않았기 때문입니다. 내가 고칠거야. 감사. – sodiumnitrate

+0

목표가 "space-separated chars"를 얻는 것이라면,'strtok()'이 좋다. 그러나 그 토큰은'atoi()'를 즉시 실행하기 때문에, [strtok()/atoi() 대신'strtol()'을 사용하면 [공백으로 분리 된 여러 정수의 문자열 해석] (https : /stackoverflow.com/q/28233450/2410359) – chux

답변

1

몇 가지 : 당신은 array

  • 루프의 수 크기에 루프를 제한하지 않는

    • 가 제대로 구성되어 있지 않습니다. 모든 저장소는 루프 내에서 수행되어야합니다. outlier 이전에있을 필요가 없습니다.
    • 루프 내에서 strtok의 호출이 잘못되었습니다. strtok의 초기 개시의 연속은 첫 번째 인수로 NULL을 지정해야합니다. 자세한 내용과 사용 예는 strtok 설명서를 참조하십시오.

    이러한 문제를 해결 한 예

  • 은 여기에 있습니다 :

    #include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
    
    int main() 
    { 
        FILE* fileptr = fopen("test.dat","r"); 
        if (fileptr == NULL) 
        { 
         perror("Failed to open file: "); 
         return EXIT_FAILURE; 
        } 
    
        char line[500]; 
        int array[20]; 
        const size_t max_size = sizeof array/sizeof *array; 
        size_t i = 0; 
    
        if (fgets(line,300,fileptr)) 
        { 
         char *token = strtok(line," "); 
         while (i < max_size && token != NULL) 
         { 
          array[i] = atoi(token); 
          printf("%d\n", array[i]); 
          ++i; 
          token = strtok(NULL, " "); 
         } 
    
         // use array and i for whatever you needed 
        } 
    
        return EXIT_SUCCESS; 
    } 
    

    출력

    1 
    2 
    3 
    4 
    
    +0

    자세한 답변을 보내 주셔서 감사합니다. 첫 번째 호출 후에'NULL '을'strtok'에 전달하는 논리는 무엇입니까? – sodiumnitrate

    +1

    @ 나트륨 니트 레이트 [strtok의 문서] (http://en.cppreference.com/w/c/string/byte/strtok)를 참조하십시오. 그것은 내가 원하는 것보다 그 목적을 설명하는 훨씬 더 나은 일을 할 것이고, 당신에게 그 과정에서 미래의 질의를 위해 북마크하는 훌륭한 사이트를 제공 할 것입니다. – WhozCraig