我正试图读取一个如下所示的文件:

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/

10-11 23:11
查看更多