fscanf无法正确匹配

时间:2016-01-26 05:16:22

标签: c scanf

我试图通读一个看起来像这样的文件:

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,将第二个单词(wantedfor sale)读入temp,将数字读入第三个var。 / p>

1 个答案:

答案 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"相同。