【问题标题】:fscanf won't read the integer values in text filefscanf 不会读取文本文件中的整数值
【发布时间】:2015-03-24 03:01:26
【问题描述】:

我正在使用 fscanf 读取行尾的 8 个 0 或 1 值的序列,但看起来该数组从未读取过任何值。

它正在从文本文件中读取:

Chilli Con Carne,Chilli_Con_Carne.txt, 15, 25, 100,0,0,0,0,0,0,0,0
Spaghetti Bolognese,Spaghetti_Bolognese.txt, 30, 75, 150, 0, 0, 0, 0, 0, 0, 1, 0
Frittata,Frittata.txt, 10, 15, 160, 1, 1, 0, 0, 0, 0, 0, 0
Korean Beef,Korean_Beef.txt, 20, 30, 100, 0, 0, 0, 0, 0, 1, 0, 1
Trawlers Pie, Trawlers_Pie.txt, 20, 30, 100,1,1,0,1,0,0,0,0

这是我正在使用的循环,其中包含未读取 recipeAllergies 的 fscanf:

while (!feof (cookBook)){

    fscanf(cookBook, "%20[^,], %20[^,], %d, %d, %d", recipeName, recipeFileName, &prepTime, &cookTime, &calories);
        printf("%s ", recipeName);

        for (i = 0; i < 8; i++){

            fscanf(cookBook, "%d,", &recipeAllergies[i]);
                printf("%d %d\n", recipeAllergies[i], userAllergies[i]);

            if ((userAllergies[i] + recipeAllergies[i]) == 2){
                notSuitable = 1;
            }

        }
        fgets(ignore_line, sizeof(ignore_line), cookBook);

        if (notSuitable == 0){
            (suitableRecipes[totalSuitable]. recipeName, recipeFileName, prepTime, cookTime, calories);
             totalSuitable++;
         }
}

非常感谢任何帮助。

【问题讨论】:

标签: c while-loop int scanf


【解决方案1】:

内部循环有一个格式字符串"%d,",因此fscanf() 正在查找后跟逗号的整数。输入行的末尾没有逗号,因此scanf() 将返回指示错误。

要么在输入行的末尾添加逗号,要么更改循环,使其第 8 次不查找逗号。后者更可取。

虽然您没有问,但您可能想用您的代码解决一些其他问题......

  • feof() 上循环是一个非常糟糕的主意,因为(以及其他问题)如果在循环体中没有检测到错误,它将尝试再读取一个 文件中的输入行不存在。
  • 始终检查 fscanf()fprintf() 等函数的返回值,因为它们可能会失败。
  • 在同一个文件上混合fgets()fscanf() 是个坏主意,因为 他们对文件内容的响应不同(例如,他们如何响应 到换行符)并结合使用它们可能会导致虚假 数据丢失。 [更一般地说,这同样适用于混合风格 输入。不要为同一个文件混合输入方式。 混合面向字符的输入(例如fgetc()),面向行的输入 (例如fgets())和/或格式化输入(例如fscanf())如果在同一个流上使用都可能导致虚假问题。]
  • if (notSuitable == 0) 块中的第一条语句不起作用 任何事物。我假设您遗漏了要成为的函数的名称 调用。

【讨论】:

    【解决方案2】:

    首先,在使用fgetc 时,在calorie 之后处理逗号。之后,读取每个数字。

    您还期望从最后一位数字开始使用逗号,因为情况可能并非如此。

    或者,您可以使用fgetc 分别丢弃每个逗号。

    您可以在 for 循环中尝试以下代码 sn-ps。

       for (i = 0; i < 8; i++){
            fgetc(cookBook); //To discard/read comma
            fscanf(cookBook, "%d", &recipeAllergies[i]);
                printf("%d %d\n", recipeAllergies[i], userAllergies[i]);
    
            if ((userAllergies[i] + recipeAllergies[i]) == 2){
                notSuitable = 1;
            }
    
        }
    

    另请参阅问题评论中提到的链接。 Why is “while ( !feof (file) )” always wrong?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 2015-05-14
      • 1970-01-01
      相关资源
      最近更新 更多