2011-12-25 205 views
0

我已经使用了很多这方面的知识,但我想知道一件事。我有一个.csv文件,我需要阅读,传递给链接列表struct。文件的行不具有相同的大小。使用fgets读取一个.CSV文件

我想用fgets()来读取每一行,然后使用strtok通过“,”获取信息并传递到struct

我正在使用LINUX。

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; 
} 

我在想这样做,但我回来了“我的朋友”分段错误!

SYNTAX FILE:

123,ABC,23 23,d,444 。 。 。

+0

在inser_last中,您使用的是base1和nv指针,但是您已将函数声明为x和y! – Neo 2011-12-25 19:57:08

+0

你能编译这个程序吗?! – Neo 2011-12-25 19:59:27

+0

no..my bad .. nodo * insert_last(nodo * base1,nodo * nv) – joaopfsilva 2011-12-25 22:10:56

回答

2

insert_last对于base1为空的情况下我看起来不太好。

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

至少我会把return nv放在这里。没有这个,你的代码的作用是将nv->next设置为nv。 (或者说尝试base1将后`NV。设置后插入nv

作为一个更广泛的观点,请注意您insert_last是O(n),因为它必须在插入之前找到列表的末尾。这意味着插入N个元素是O(N )。一个体面的链表实现将跟踪内存中的尾部元素并在固定时间内插入。

更新:阅读其余的代码。这也是无效:

nodo *base1; 

put2memory(base1); 

base1尚未初始化,并在这一点上的垃圾值。你正试图用它作为指针。

下面是如何解决它一个建议:

  • 添加return语句insert_last。我建议返回列表头。更好的办法是存储头部和尾部,避免O(N)插入。

  • 更改您要insert_last呼吁像做:

    LIST_HEAD = insert_last(BASE1,NV);

  • main,你可以这样做:

    LIST_HEAD = put2memory(NULL);

再次更新:为了说明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; 
}