我试图通读一个看起来像这样的文件:
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,将第二个单词(wanted
或for sale
)读入temp,将数字读入第三个var。 / p>
答案 0 :(得分:4)
fscanf
不起作用。指定%s
格式说明符时,它会读取所有内容,直到下一个空格(或输入结束)。这意味着您的第一个%s
将读取truck,
,即在其读取的字符串中包含逗号。 %s
并不关心您在,
之后放置%s
格式字符串,因此有点“请求”将逗号保留为未读。 fscanf
不支持此类请求。 fscanf
没有任何高级前瞻或模式匹配功能。它盲目地读取当前格式说明符所要求的数量。 %s
读到下一个空格 - 这就是它关心的所有内容。
如果您想将其作为CSV值阅读,则必须在每一步都手动指导fscanf
。在这种情况下,您可以对所有字符串值使用%[^,]
。像这样的东西可能会起作用
fscanf(file,
"%[^,], %[^,], %d",
items[i].type,
temp,
&items[i].price)
如果要跳过任何前导空格,可以使用" %[^,], %[^,], %d"
格式。
%d
之前的空格可以省略,这意味着"%[^,], %[^,],%d"
与"%[^,], %[^,], %d"
相同。