2011-12-25 5 views
0

나는 이것에 관해 이미 많이 봤지만 한 가지를 알고 싶다. 내가 읽어야하는 .csv 파일이 있습니다. 연결된 목록이있는 struct으로 전달하십시오. 파일 줄이 같은 크기가 아닙니다.fgets를 사용하여 .CSV 파일을 읽는 방법

각 줄을 읽으려면 fgets()을 사용하고 strtok을 사용하여 ","을 통해 정보를 얻은 다음 struct으로 전달하십시오.

나는 리눅스를 사용하고 있습니다.

typedef struct nodo 
{ 
int row1; 
char row2; 
int row3; 
struct nodo *next; 
struct nodo *nant; 
}nodo; 

nodo* insert_last(nodo* base1, nodo* nv) 
{ 
    if(base1 == NULL) 
     base1 =nv; 

    base1->next = NULL; 
    while(base1->next != NULL) 
     base1 = base1->next; 
    base1->next = nv; 
    nv->nant = base1; 
    nv->next = NULL;  
} 

nodo* put2memory(nodo *base1) 
{ 
    nodo *nv; 
    FILE *fp1=fopen(xxx,"r"); 
    char *tok; 

    while(fgets((buffer, sizeof(buffer),fp1) != NULL)) 
    { 
     nv = (nodo*) malloc (sizeof(nodo)); 
     nv->next=NULL; 
     tok = strtok(buffer,","); 
     nv->row1=tok; 
     tok = strtok(NULL,","); 
     nv->row2=tok; 
     tok = strtok(NULL,","); 
     nv->row3=tok; 

     insert_last(base1,nv); 
    } 
    free(nv); 
} 

int main() 
{ 
    nodo *base1; 

    put2memory(base1); 
    return 0; 
} 

나는 이렇게 생각하고 있습니다.하지만 "내 친구"세분화 오류가 반환됩니다.

구문 FILE :

123 ABC 23 23 D 444 . . .

+0

inser_last에서 base1 및 nv 포인터를 사용하지만 함수에 매개 변수를 x 및 y로 선언했습니다! – Neo

+0

이 프로그램을 컴파일 할 수 있습니까?! – Neo

+0

no.my bad .. nodo * insert_last (nodo * base1, nodo * nv) – joaopfsilva

답변

2

insert_lastbase1이 null 인 경우 나에게 좋지 않습니다.

nodo* insert_last(nodo* base1, nodo* nv) 
{ 
    if(base1 == NULL) 
     base1 =nv; 

최소한 여기에 return nv을 입력합니다. 코드가 없으면 nv->next에서 nv으로 설정됩니다. 넓은 점으로

(또는 오히려 네바다. '후 설정됩니다 base1nv를 삽입하려고)가 삽입하기 전에 목록의 끝을 찾아야합니다 이후 insert_last는 O (N) 인 것을 확인합니다. 즉, N 개의 요소를 삽입하는 것은 O (N)입니다. 알맞은 연결 목록 구현은 메모리의 꼬리 요소를 추적하고 일정 시간에 삽입합니다.

업데이트 : 나머지 코드를 읽습니다.

nodo *base1; 

put2memory(base1); 

base1

가 초기화되지 않은이 시점에서 쓰레기 값이 또한 유효하지 않습니다. 포인터로 사용하려고합니다.

  • insert_lastreturn 문을 추가합니다

    는 여기를 해결하는 방법에 대한 하나 개의 제안입니다. 목록의 머리를 되 돌리는 것이 좋습니다. 머리와 꼬리를 모두 보관하고 O (N) 삽입물을 피하는 것이 더 좋습니다.

  • 변경 insert_last에 전화 같은 것을 할 :

    list_head = insert_last을 (base1, NV);

    list_head = put2memory (NULL);

  • main, 당신은 뭔가를 할 수 있습니다

업데이트가 다시 :는 O (1) 삽입을 설명하기 위해 여기 put2memory의 조정이다.궁극적으로 모든 목록 노드에 free()을 호출해야합니다.

nodo* put2memory() 
{ 
    nodo *head = NULL, *prev = NULL, *nv; 
    FILE *fp1=fopen(xxx,"r"); 
    char *tok; 

    while(fgets((buffer, sizeof(buffer),fp1) != NULL)) 
    { 
     nv = (nodo*) malloc (sizeof(nodo)); 
     nv->next=NULL; 
     tok = strtok(buffer,","); 
     nv->row1=tok; 
     tok = strtok(NULL,","); 
     nv->row2=tok; 
     tok = strtok(NULL,","); 
     nv->row3=tok; 

     if (prev) 
      prev = prev->next = nv; 
     else 
      head = prev = nv; 
    } 

    return head; 
} 
관련 문제