【问题标题】:fscanf not matching properlyfscanf 没有正确匹配
【发布时间】:2016-05-02 15:18:51
【问题描述】:

我正在尝试读取如下所示的文件:

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。

【问题讨论】:

    标签: c scanf


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2021-08-23
      • 1970-01-01
      • 2011-06-05
      • 2018-03-28
      • 1970-01-01
      相关资源
      最近更新 更多