我正试图读取一个如下所示的文件:
truck, wanted, 4000
truck, for sale, 2000
microwave, for sale, 2
truck, wanted, 4000
但我的
fscanf
正在返回1
(应该是3
):fscanf(file,
"%s, %[^,], %d",
items[i].type,
temp,
&items[i].price)
基本上,我想像CSV一样读取它,第一个单词读入第一个var,第二个单词读入temp(或者
wanted
或者for sale
),数字读入第三个var。 最佳答案
fscanf
不是这样工作的。当您指定%s
格式说明符时,它将读取所有内容,直到下一个空白(或输入结束)。这意味着您的第一个%s
将读取truck,
,即在它读取的字符串中包含逗号。%s
并不关心在格式字符串中,您将,
放在%s
之后,因此有点“请求”逗号保持未读状态。fscanf
不支持此类请求。fscanf
没有任何高级前瞻或模式匹配功能。它盲目地读取当前格式说明符所请求的内容。%s
读取到下一个空白-这就是它所关心的。
如果您想将其读取为CSV值,则必须手动指导这一过程中的每个步骤。在这种情况下,可以对所有字符串值使用fscanf
。像这样的事情可能行得通
fscanf(file,
"%[^,], %[^,], %d",
items[i].type,
temp,
&items[i].price)
如果要跳过任何前导空格,可以使用
%[^,]
格式。可以省略
" %[^,], %[^,], %d"
之前的空格,这意味着%d
与"%[^,], %[^,],%d"
相同。关于c - fscanf不正确匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35007436/