使用 atoi 解析 csv 文件

Posted

技术标签:

【中文标题】使用 atoi 解析 csv 文件【英文标题】:using atoi parsing a csv file 【发布时间】:2014-03-09 20:43:29 【问题描述】:

我正在编写一个程序来解析具有以下格式的 csv 文件:

hotdog,10,2,1.5

bun,10,2,0.5

代码应该删除文件的每一行,到目前为止,我只是试图打印这些值以确保格式正确。我的问题是正确解释数字数据 - 程序不是在 csv 文件中打印整数值,而是打印零。该程序正确解析了csv中每条记录的第一个字段,所以我认为问题与我的atoi格式有关。这是我写的代码:

char buffer[512]; //512 byte buffer holds the 10 food item names
char* currentLine = buffer; //a temporary pointer to hold the current line read from the csv file

FILE* fp = fopen("inventory.csv", "rw"); //open the inventory.csv file with read and write capabilities.
int i = 0; //counter
while(fgets(currentLine, 1024, fp) != NULL)
    printf("%s\n", strtok(currentLine, ",")); //get first field. Should be the food name.
    printf("%d\t", atoi(strtok(currentLine, ","))); //get second field. Should be stock amount
    printf("%d\t", atoi(strtok(currentLine, ","))); //get third field.
    printf("%f\n", atof(strtok(currentLine, ","))); //get forth field.
    i++;

fclose(fp);

按原样运行会产生以下输出:

hotdog
0   0   0.000000
bun
0   0   0.000000

是我的atoi格式有问题吗?

【问题讨论】:

那些512和1024是怎么对应的? 【参考方案1】:

查看 strtok 的文档,例如: http://www.cplusplus.com/reference/cstring/strtok/

只有第一次调用需要缓冲区。 后续调用应传递一个空指针来检索以下令牌。

【讨论】:

【参考方案2】:

问题在于strtok。在您第一次调用strtok 之后,如果您希望它继续解析相同的字符串而不是从头开始,您必须提供NULL 作为第一个参数。见文档:http://www.cplusplus.com/reference/cstring/strtok/

【讨论】:

以上是关于使用 atoi 解析 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 在文本文件 (CSV) 中解析 XML 文件

使用 NodeJS 解析 CSV 文件

如何使用熊猫解析 CSV 文件?

iOS-解析读取CSV文件,解析excel文件

使用 D3.js 解析上传的 CSV 文件

使用 Node/Express 解析 CSV 文件会吐出奇怪的 \x001 代码