【发布时间】:2017-08-02 01:12:47
【问题描述】:
我正在尝试使用 C 中的 strtok 来读取 csv 文件,并将内容存储到 struct Game 的数组中。 我的代码如下所示:
FILE *fp;
int i = 0;
if((fp=fopen("Games.csv","r"))==NULL)
{
printf("Can't open file.\n");
exit(1);
}
rewind(fp);
char buff[1024];
fgets(buff,1024,fp);
char* delimiter = ",";
while(fgets(buff, 1024, (FILE*)fp)!=NULL && i<5){
Game[i].ProductID= strtok(buff, ",");
Game[i].ProductName = strtok(NULL, delimiter);
Game[i].Publisher = strtok(NULL, delimiter);
Game[i].Genre = strtok(NULL, delimiter);
Game[i].Taxable = atoi(strtok(NULL, delimiter));
Game[i].price = strtok(NULL, delimiter);
Game[i].Quantity = atoi(strtok(NULL, delimiter));
printf("%s\n", Game[i].ProductID);
i++;
}
i = 0;
for(i = 0; i<5; i++){
printf("%s", Game[i].ProductID);
}
输出如下图:
DS_25ROGVOIRY
DS_25MMD4N2BL
DS_258KADVNLH
DS_25UR7M375D
DS_25FP45CJFZ
DS_25AN1EA3PV,Blitz I: The League,Midway Games,Sports,0,$103.03 ,2
DS_25AN1EA3PV,Blitz I: The League,Midway Games,Sports,0,$103.03 ,2
DS_25AN1EA3PV,Blitz I: The League,Midway Games,Sports,0,$103.03 ,2
DS_25AN1EA3PV,Blitz I: The League,Midway Games,Sports,0,$103.03 ,2
DS_25AN1EA3PV,Blitz I: The League,Midway Games,Sports,0,$103.03 ,2
前五行(在 while 循环中)是正确的。但是,最后五行(while 循环外)是错误的,它会打印整行内容。
我对此感到很困惑。当数组改变时,while循环后如何仍然打印正确的答案。
【问题讨论】:
-
与你的问题无关,strtok可以给你解析csvs的意外行为。即 "a,b,,c,d" 将解析为 4 个值而不是 5 个。
-
CSV 可以在字段中嵌入逗号。例如,
zero,"one,two",three是三个字段。strtok()无法处理。