使用fgets读取.CSV文件

时间:2011-12-25 19:52:32

标签: c data-structures csv

我已经搜索了很多关于此的内容,但我想知道一件事。我有一个.csv文件,我需要阅读,传递到带有链表的struct。文件行的大小不同。

我在考虑使用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;
}

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

语法文件:

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

1 个答案:

答案 0 :(得分:2)

对于insert_last为空的情况,

base1对我来说不太好。

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

至少我会把return nv放在这里。如果没有这个,您的代码所做的就是将nv->next设置为nv。 (或者更确切地说,在{nv之后设置nv之后插入base1

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

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

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