2015-01-23 2 views
2

나는 Csv 형식으로 다른 파일을 읽어야하는 C로 프로그램을 작성하고 있습니다. 모든 파일은 두 줄로 구성됩니다. 첫 번째 줄은 저장되는 항목을 설명하고 두 번째 줄은 항목의 데이터를 포함합니다. 모든 파일에는 개의 6 개의 열이 있습니다. 데이터는 날짜, 소스 및 카테고리와 같은 정보입니다. 실제로 경로를 얻는 프로그램을 작성하고 콘텐츠를 하나의 동적 문자 배열로 돌려 주지만 항상 디버그 어설 션 오류가 발생하여 항상 충돌합니다. 내 코드는 다음과 같습니다 어쨌든 끝에 첫 번째를 삭제할 원인 데이터가 저장되지 않기 때문에 C - csv 파일을 읽음으로써 디버그 어설 션 오류 오류가 발생했습니다.

char* readfile(char csvpath[]) { 
FILE *csv; 
int c; 
int countcontent = 100;     //counter for the length of the content array 
int counter = 0;     //counter of the amount of the inserted chars 
char *temp;      //temp = buffer 
char *content = (char*)calloc(100,sizeof(char)); //content of the file 
csv = fopen(csvpath,"r"); 
while(c = fgetc(csv) != EOF) {    //while file isnt at the end 
    if(countcontent <= counter) { 
     realloc(content,100*sizeof(char)); 
     countcontent += 100; 
    } 
    temp = (char*)calloc(20,sizeof(char)); 
    fgets(temp,20,csv); 
    content = concat(content,temp);   //concat is my own function and add the 2. string behind the 1. 
    counter+= 20; 
} 
fclose(csv); 
return content;} 

Assert Screenshot

사실 난, 두 개의 서로 다른 라인이 있다는 것을 무시합니다. 하지만이 오류에 대한 해결책을 찾도록 도와 줄 수 있습니까?

+1

우선, [malloc (및 가족)의 반환을해서는 안됩니다.] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of- malloc). 둘째 * 디버거 사용 *. –

+0

'c = fgetc (csv)! = EOF'는'c = (fgetc (csv)! = EOF) '와 동일합니다.' –

+0

'stream! = NULL'은'fgetc'에서 실패했습니다. 열렸다. – ElderBug

답변

1

귀하의 문제는이 라인

realloc(content,100*sizeof(char)); 

realloc 기능 반환 재 할당 된 메모리에 대한 포인터입니다. realloc 호출이 이미 할당 된 청크의 크기를 조정할 수없고 실제로 전달되는 포인터를 자동으로 업데이트 할 수 없으므로 완전히 새로운 메모리 덩어리를 할당해야한다면 어떻게 될지 생각해보십시오.

해당 문구의 또 다른 문제점은 더 많은 메모리를 필요로하지 않는다는 것입니다. 항상100 바이트를 할당하십시오. realloc에 제공 한 크기 인수는 크기입니다.

아, 그리고 realloc이 실패하고 NULL 포인터를 반환 할 수 있습니다. 원래 포인터를 풀고 싶지 않으면 반환 된 포인터를 저장할 임시 변수가 있어야하고 NULL을 확인하십시오.

+0

당신은 콘텐츠 = realloc (content, 100 * sizeof (char)) ;;를 사용해야한다는 것을 의미합니다; 실제로 내가 디버거를 사용할 때 내 프로그램은 지금까지 오지 않는다. 그것은 while 명령에서 이미 멈춘다. – LAN

+0

@LAN 전체 답변을 읽고 'realloc'참조 링크를 따라 읽으십시오. –

+0

@LAN'fgetc' (아마도)에서의 충돌은 아마도'fopen' 호출이 실패하고'NULL' 포인터를 주었기 때문일 것입니다. *** 값을 반환하는 모든 *** 함수에 대해 *** 항상 *** 오류에 대해 반환 된 값을 확인해야합니다. –

관련 문제