2013-02-22 5 views
4

상당히 기본적인 부분에 문제가 있습니다. 아래에 표시된 파일에서 각 줄을 읽고 strtok을 사용하여 세 부분으로 나누고 각 부분을 배열에 저장해야합니다. "goals"와 "assists"에 대한 배열은 완벽하게 작동하지만, 어떤 이유로 전체 이름 배열은 파일에서 읽은 성으로 채워집니다.fgets와 strtok를 사용하여 파일의 행을 읽고 파싱하기.

입력 파일 :

Redden 2 0 
Berglund 5 2 
Jackman 2 0 
Stewart 4 0 
Oshie 3 5 
McDonald 2 4 
Pietrangelo 2 7 
Perron 2 6 
Tarasenko 5 5 

관련 코드 : 어떤 이유

int main(int argc, char* argv){ 
    FILE* inFile = fopen(argv[1],"r"); 
    char ** nameArray; 
    int * goalArray; 
    int * assistArray; 
    int size = countLinesInFile(inFile); 
    allocateMemory(&goalArray, &assistArray, &nameArray, size); 
    readLinesFromFile(inFile, goalArray, assistArray, nameArray, size); 
} 

void allocateMemory(int** goals, int** assists, char*** names, int size) 
{ 
    *goals = malloc(size*sizeof(int)); 
    *assists = malloc(size*sizeof(int)); 
    *names = malloc(size*sizeof(char *)); 
    int i; 
    for(i=0; i<size; i++) 
    { 
    *(*names + i) = calloc(MAX_NAME,sizeof(char)); 
    } 
} 

void readLinesFromFile(FILE* fPtr, int* goals, int* assists, char** names, int numLines) 
{ 
    int i; 
    char * buffer = malloc(MAX_LINE*sizeof(char)); 
    for(i = 0; i<numLines; i++) 
    { 
    if(fgets(buffer, MAX_LINE, fPtr)!= NULL) 
    { 
     names[i] = strtok(buffer, " \n"); 
     goals[i] = atoi(strtok(NULL, " \n")); 
     assists[i] = atoi(strtok(NULL, " \n")); 
    } 
    } 
} 

, nameArray [0-9] 모두가 "타라 센코"를 포함하고,이 어떤 도움을 크게 감상 할 수있다.

답변

1

strtok은 다음 토큰을 포함하는 Null 종료 문자열에 대한 포인터를 반환합니다. '당신은 동적으로 malloc를 호출하여 buffer를 할당

void readLinesFromFile(/*...*/) 
{ 
    char * buffer = malloc(MAX_LINE*sizeof(char)); 
    // ... 
    fgets(buffer, MAX_LINE, fPtr); 
    // ... 
} 

,하지만 당신은 돈 :

또한
strcpy(names[i], strtok(buffer,  " \n")); 
strcpy(goals[i], atoi(strtok(NULL, " \n"))); 
strcpy(assists[i], atoi(strtok(NULL, " \n"))); 

코드에서 메모리 누수가 있습니다 : 실제로이 토큰을 복사하려면, 당신은 strcpy 사용해야합니다 이 메모리를 비우십시오. malloc에 의해 할당 된 메모리를 가리키는 포인터에 free()을 호출하는 것을 잊지 마십시오. 그러나이 경우 자동 저장 기간이있는 배열이 더 나은 선택입니다.

void readLinesFromFile(/*...*/) 
{ 
    char buffer[MAX_LINE]; 
    // ... 
    fgets(&buffer, MAX_LINE, fPtr); 
    // ... 
} 
1

이름을 복사하지 않았 으면 strtok에 의해 반환 된 포인터를 데이터 구조에 넣으면됩니다. buffer이 가리키는 동일한 메모리에 동일한 포인터로 가득 찬 데이터 구조로 끝나기 만하면됩니다. buffer의 내용이 루프를 통과 할 때마다 수정되기 때문에 마지막으로 끝난 시점에 대한 포인터가 여러 개 있습니다.

+0

감사합니다. – user2100887