使用fgets读取.CSV文件

使用fgets读取.CSV文件,c,data-structures,csv,C,Data Structures,Csv,我已经在谷歌上搜索了很多,但我想知道一件事。我有一个.csv文件需要读取,并通过链表传递到struct。文件行的大小不相同 我想使用fgets()阅读每一行,然后使用strok通过“,”获取信息,并传递到struct 我正在使用LINUX typedef struct nodo { int row1; char row2; int row3; struct nodo *next; struct nodo *nant; }nodo; nodo* insert_last(nodo* ba

我已经在谷歌上搜索了很多,但我想知道一件事。我有一个
.csv
文件需要读取,并通过链表传递到
struct
。文件行的大小不相同

我想使用
fgets()
阅读每一行,然后使用
strok
通过“,”获取信息,并传递到
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,23 23,d,444 . .
.

insert\u last
对于
base1
为空的情况,我觉得不太好

nodo* insert_last(nodo* base1, nodo* nv)
{
    if(base1 == NULL)
        base1 =nv;
至少我会把
返回nv
放在这里。如果没有它,代码所做的就是将
nv->next
设置为
nv
。(或者尝试在
base1
之后插入
nv
,后者将设置在'nv'之后。)

更广泛的一点是,请注意您的
insert\u last
是O(n),因为它必须在插入之前找到列表的末尾。这意味着插入N个元素是O(N2)。一个合适的链表实现将跟踪内存中的尾部元素,并以恒定的时间插入

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

nodo *base1;

put2memory(base1);
base1
尚未初始化,此时为垃圾值。您试图将其用作指针

这里有一个关于如何修复它的建议:

  • return
    语句添加到
    insert\u last
    。我建议把名单的头还给你。更好的方法是同时保存头部和尾部,避免O(N)插入

  • 将您的呼叫更改为
    insert_last
    ,执行以下操作:

    列表头=插入最后一个(base1,nv)

  • main
    中,您可以执行以下操作:

    列表头=put2memory(空)

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

在inser_last)中,您使用的是base1和nv指针,但您已将函数的参数声明为x和y!你能编译这个程序吗?!不..我的错。。nodo*最后插入(nodo base1,nodo nv)元素
行2
只能包含一个字符;数据文件中该字段有3个字符。