2015-01-27 8 views
0

몇 백개의 정수가있는 파일을 읽으려고합니다. 일부는 음수이고, 어떤 것은 음수이고 배열에 저장하려고합니다. 그들은 strtok을 사용하여 문자열로 읽어야합니다. 세분화 오류가 계속 발생하며 이유가 확실하지 않습니다. 카운트는 얼마나 많은 총 정수가 파일에 있는지 파악하는 것입니다.파일에서 문자열을 읽어서 C로 정수로 배열에 저장

/*Input file looks like this: 
718321747 -1828022042 
-1665405912 -175307986 
-53757018 -1551069786 525902369 
-1945908378 853648883 
*/ 

int main(int argc, char* argv[]) 
{ 
    char buffer[50]; 
    char* token; 
    int count = 0; 
    int num = 0; 
    int arr[MAX_SIZE]; 
    if (argc != 2) 
    { 
     printf("Invalid number of arguments\n"); 
     return 0; 
    } 
    FILE* fptr = fopen(argv[1], "r"); 
    //open file 
    if (fptr == NULL) 
    { 
     printf("Unable to open file\n"); 
     return 0; 
    } 
    while(fgets(buffer, 50, fptr)) 
    //to get the file line by line 
    { 
     token = strtok(buffer, "\n\t "); 
     //find first token 
      num = atoi(token); 
      //convert it to an int 
      arr[count] = num; 
      //store in array 
      count++; 

      while(token != NULL) 
      //get rest of tokens and convert to int 
      { 
       token = strtok(buffer, "\n\t "); 
       num = atoi(token); 
       arr[count] = num; 
       count++; 
      } 
    } 
return 0; 
} 
+4

'strtok()'에 대한 두 번째 호출이 첫 번째 매개 변수로 NULL을 갖지 않아야합니까? – John3136

+0

나를보기 드문 드문 _after_ 코드 라인. – chux

답변

2

토큰이 문자열에 경우 확인하지, 당신은 strtok()atoi()를 호출하기 전에 NULL를 반환하지 않았 음을 확인해야합니다.

그런 다음 각 반복에서 동일한 문자열을 strtok() 문자열로 전달하는 것은 잘못된 것입니다. 처음으로 NULL을 전달해야합니다.

또한 atoi() 대신 strtol()을 사용하여 변환이 성공했는지 확인하는 것이 좋습니다.

확인이 코드, 나는 그것을 고정

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

#define MAX_SIZE 1000 /* ? whatever value you think is good. */ 

int main(int argc, char* argv[]) 
{ 
    char buffer[50]; 
    int count = 0; 
    int arr[MAX_SIZE]; 

    if (argc != 2) 
    { 
     printf("Invalid number of arguments\n"); 
     return 0; 
    } 

    FILE* fptr = fopen(argv[1], "r"); 
    //open file 
    if (fptr == NULL) 
    { 
     printf("Unable to open file\n"); 
     return 0; 
    } 

    //to get the file line by line 
    while ((fgets(buffer, 50, fptr) != NULL) && (count < MAX_SIZE)) 
    { 
     char *pointer; 
     char *token; 

     pointer = buffer; 
     while (((token = strtok(pointer, "\n\t ")) != NULL) && (count < MAX_SIZE)) 
     { 
      char *endptr; 

      arr[count] = strtol(token, &endptr, 10); 
      printf("%d\n", arr[count]); 
      if (*endptr != '\0') 
       printf("error: could not convert %s to integer\n", token); 
      else 
       count++; 
      pointer = NULL; 
     } 
    } 
    return 0; 
} 

나는 당신의 입력 데이터의 구조를 보지 않았기 때문에 당신을 위해 작동 잘 모르겠지만, 나는 그것이 분할을 발생하지 않습니다 확신 결점.

+0

이제는 오류가 발생하지 않지만 입력 파일의 첫 번째 행만 읽습니다. 데이터의 구조는 새로운 줄, 공백 및 탭으로 구분됩니다. – iamklutch4life

+0

@BrianHurley 파일 내용의 샘플을 게시해야합니다. 이 질문에 대해서는 대답 일 뿐이므로 결과가 예상과 다른 이유를 묻는 새로운 질문을 게시해야합니다. –