求助,关于C语言读取的问题

我现有一个csv的文件,里面有<name><brand><price><stock>,怎么样能将里面的数据读出来并存入链表中。
例如csv是这样的
milk,pura,300,5
coke,pepsi,20,10
最好有代码,谢啦,悬赏

#include <stdio.h>
#include <stdlib.h>

typedef struct csv_node
{
char name[50];
char brand[50];
int price;
int stock;
struct csv_node *next;
}CsvNode;

void PrintCvsList(CsvNode *head)
{
CsvNode *p=head;
while(p!=NULL)
{
printf("%s,%s,%d,%d\n",p->name,p->brand,p->price,p->stock);
p=p->next;
}
}

void apart(char *str,char *name,char *brand,int *price,int *stock)
{
while(*str&&*str!=',')
{
*name++=*str++;
}
*name='\0';
str++;

while(*str&&*str!=',')
{
*brand++=*str++;
}
*brand='\0';
str++;

*price=0;
while(*str&&*str!=',')
{
(*price)*=10;
(*price)+=*str-'0';
str++;
}
str++;

*stock=0;
while(*str&&*str!=',')
{
(*stock)*=10;
(*stock)+=*str-'0';
str++;
}
str++;
}

CsvNode* ReadCsvFile(char *FileName)
{
FILE *fp;
int state;
char line[100];
char name[50],brand[50];
int price,stock;

CsvNode *head=NULL,*p,*q=NULL;

if((fp=fopen(FileName,"r"))==NULL) return NULL;

while(1)
{
if(fgets(line,100,fp)==NULL) break;
apart(line,name,brand,&price,&stock);

p=(CsvNode *)malloc(sizeof(CsvNode));
if(p==NULL) break;
strcpy(p->name,name);
strcpy(p->brand,brand);
p->price=price;
p->stock=stock;

if(head==NULL) head=p;
else q->next=p;

q=p;
}
q->next=NULL;

fclose(fp);
return head;
}

int main()
{
CsvNode *head;
head=ReadCsvFile("d:\\csv.txt");
PrintCvsList(head);

system("pause");
return 0;
}追问

如果是stock.csv的文件也行吗?我换成了CSV的文件,但是读取数字的最后一步stock有点小问题,应该怎么办?

追答

#include
#include

typedef struct csv_node
{
char name[50];
char brand[50];
int price;
int stock;
struct csv_node *next;
}CsvNode;

void PrintCsvList(CsvNode *head)
{
CsvNode *p=head;
while(p!=NULL)
{
printf("%s,%s,%d,%d\n",p->name,p->brand,p->price,p->stock);
p=p->next;
}
}

void apart(char *str,char *name,char *brand,int *price,int *stock)
{
while(*str&&*str!=',')
{
*name++=*str++;
}
*name='\0';
str++;

while(*str&&*str!=',')
{
*brand++=*str++;
}
*brand='\0';
str++;

*price=0;
while(*str&&*str!=',')
{
(*price)*=10;
(*price)+=*str-'0';
str++;
}
str++;

*stock=0;
while(*str&&*str!=','&&*str!='\n'&&*str!='\r')
{
(*stock)*=10;
(*stock)+=*str-'0';
str++;
}
str++;
}

CsvNode* ReadCsvFile(char *FileName)
{
FILE *fp;
int state;
char line[100];
char name[50],brand[50];
int price,stock;

CsvNode *head=NULL,*p,*q=NULL;

if((fp=fopen(FileName,"r"))==NULL) return NULL;

while(1)
{
if(fgets(line,100,fp)==NULL) break;
apart(line,name,brand,&price,&stock);

p=(CsvNode *)malloc(sizeof(CsvNode));
if(p==NULL) break;
strcpy(p->name,name);
strcpy(p->brand,brand);
p->price=price;
p->stock=stock;

if(head==NULL) head=p;
else q->next=p;

q=p;
}
q->next=NULL;

fclose(fp);
return head;
}

int main()
{
CsvNode *head;
head=ReadCsvFile("d:\\stock.csv");
PrintCsvList(head);

system("pause");
return 0;
}

追问

如果我换成abc.csv的文件,最后一个stock会读错了,这是什么原因?

追答

你把abc.csv贴出来,如果文件很长,就把最后几行贴出来,要完整,特别是最后一行,我怀疑是你最后一行不合法或不是有效行。

温馨提示:答案为网友推荐,仅供参考
相似回答