Scanf未读取C中CSV中找到的所有数字
我正在尝试读取一个Scanf未读取C中CSV中找到的所有数字,c,loops,C,Loops,我正在尝试读取一个CSV整数文件并计算它们的数量。但是,代码只执行一次while循环。 当我更改文件的格式,使每个数字都在单独的一行上,并且没有逗号时,它就起作用了。有人能告诉我哪里出了错吗?如何使循环适用于CSV while(scanf("%d", &otherNum)==1) { count++; printf("%d", otherNum); } 一旦“%d”命中非整数(逗号或任何其他字符),它将退出while循环 您需要在“%d”和循环中的其他字符之间建立解析逻
CSV
整数文件并计算它们的数量。但是,代码只执行一次while循环。
当我更改文件的格式,使每个数字都在单独的一行上,并且没有逗号时,它就起作用了。有人能告诉我哪里出了错吗?如何使循环适用于CSV
while(scanf("%d", &otherNum)==1)
{
count++;
printf("%d", otherNum);
}
一旦“%d”命中非整数(逗号或任何其他字符),它将退出while循环
您需要在“%d”和循环中的其他字符之间建立解析逻辑。最好使用下面的代码
char num[50];
int otherNum = 0;
FILE *f = fopen("yourCSV.csv", "w");
while(fgets(num,sizeof num,f){
if(num[0] != ',')
{
otherNum = atoi(num);
printf("%d", otherNum);
}
}
读取一个包含整数的CSV文件?但是
scanf(“%d”和&otherNum)
将从stdin
而不是从CSV文件中读取。更好地使用fscanf(fp、%d、&otherNum)
其中fp
指向您的CSV文件。@achal:stdin可以重定向到一个文件…是@SergeBallesta,但code OP显示它似乎不是这样。无论如何,这不是问题所在。scanf
et-alii真是穷人的解析器。您应该只在快速且不干净的开发中使用它们,或者当您确定格式可以接受时使用它们-但是在这种情况下,请测试返回值。要读取csv文件,您确实应该使用fgets
来读取行,然后如果没有引号,则使用strtok
或strcspn
,如果引号字段中可以存在逗号或换行符,则使用十进制解析器。这样的添加跳过了空白。但是逗号或CSV输入中使用的任何分隔符呢?@Jens,请尊重你的建议。我已经修改了我的答案。fscanf(f,“%s”,num)
类似于推荐过时的get()
。由于缓冲区溢出的可能性,代码很弱。IAC不需要“%s”
中的前导空格。@chux,谢谢你的建议。我已经更正了答案。:-)@chux格式中的任何空白都会跳过输入中的任何空白,因此,如果列包含空白或换行符,则需要该格式。