我现有一个csv的文件,里面有<name><brand><price><stock>,怎么样能将里面的数据读出来并存入链表中。
例如csv是这样的
milk,pura,300,5
coke,pepsi,20,10
最好有代码,谢啦,悬赏
如果是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贴出来,如果文件很长,就把最后几行贴出来,要完整,特别是最后一行,我怀疑是你最后一行不合法或不是有效行。