fscanf不会读取文本文件中的整数值

时间:2015-03-24 03:01:26

标签: c while-loop int scanf

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

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

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

这是我正在使用的循环,其中包含未读取recipeAlergies的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++;
         }
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

在输入行的末尾添加逗号,或者更改循环,以便它不会在第8次查找逗号。后者是可取的。

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

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

答案 1 :(得分:0)

首先,在calorie使用fgetc后处理逗号。之后,阅读每个号码。

你也期待最后一位数的逗号,因为可能不是这样。

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

您可以在for循环中尝试使用以下代码段。

   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?