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格式中的任何空白都会跳过输入中的任何空白,因此,如果列包含空白或换行符,则需要该格式。