fscanf 不会读取文本文件中的整数值
fscanf won't read the integer values in text file
我正在使用 fscanf 读取行尾的 8 个零值或一值的序列,但看起来数组从未读取过值。
正在从文本文件中读取:
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++;
}
}
非常感谢任何帮助。
首先,在使用fgetc
时,在calorie
之后处理逗号。之后,读取每个数字。
您还希望最后一位数字有逗号,但实际情况可能并非如此。
或者,您可以使用 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;
}
}
另请参阅问题评论中提到的 link。 Why is “while ( !feof (file) )” always wrong?
内部循环有一个格式字符串 "%d,"
,所以 fscanf()
正在寻找后跟逗号的整数。输入行的末尾没有逗号,因此 scanf()
将 return 指示错误。
在输入行的末尾添加逗号,或者更改循环,使其第 8 次不再查找逗号。后者更可取。
虽然您没有询问,但您可能还想用代码解决其他一些问题......
- 在
feof()
上循环是一个非常糟糕的主意,因为(除其他问题外)如果在循环体中没有检测到错误,它将尝试再读取一个
您文件中的输入行比现有的多。
- 始终检查
fscanf()
和 fprintf()
等函数的 return 值,因为它们可能会失败。
- 在同一个文件中混合
fgets()
和 fscanf()
是个坏主意,因为
他们对文件内容的反应不同(例如,他们如何回应
到换行符)并将它们组合使用会导致虚假
数据丢失。 [更一般地说,混合风格也是如此
输入。不要混合输入同一文件的方式。
混合面向字符的输入(例如 fgetc()
),面向行的输入
(例如 fgets()
)、and/or 格式的输入(例如 fscanf()
)如果在同一流上使用它们都可能导致虚假问题。]
if (notSuitable == 0)
块中的第一条语句不执行
任何事物。我假设你遗漏了函数的名称
打电话。
我正在使用 fscanf 读取行尾的 8 个零值或一值的序列,但看起来数组从未读取过值。
正在从文本文件中读取:
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++;
}
}
非常感谢任何帮助。
首先,在使用fgetc
时,在calorie
之后处理逗号。之后,读取每个数字。
您还希望最后一位数字有逗号,但实际情况可能并非如此。
或者,您可以使用 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;
}
}
另请参阅问题评论中提到的 link。 Why is “while ( !feof (file) )” always wrong?
内部循环有一个格式字符串 "%d,"
,所以 fscanf()
正在寻找后跟逗号的整数。输入行的末尾没有逗号,因此 scanf()
将 return 指示错误。
在输入行的末尾添加逗号,或者更改循环,使其第 8 次不再查找逗号。后者更可取。
虽然您没有询问,但您可能还想用代码解决其他一些问题......
- 在
feof()
上循环是一个非常糟糕的主意,因为(除其他问题外)如果在循环体中没有检测到错误,它将尝试再读取一个 您文件中的输入行比现有的多。 - 始终检查
fscanf()
和fprintf()
等函数的 return 值,因为它们可能会失败。 - 在同一个文件中混合
fgets()
和fscanf()
是个坏主意,因为 他们对文件内容的反应不同(例如,他们如何回应 到换行符)并将它们组合使用会导致虚假 数据丢失。 [更一般地说,混合风格也是如此 输入。不要混合输入同一文件的方式。 混合面向字符的输入(例如fgetc()
),面向行的输入 (例如fgets()
)、and/or 格式的输入(例如fscanf()
)如果在同一流上使用它们都可能导致虚假问题。] if (notSuitable == 0)
块中的第一条语句不执行 任何事物。我假设你遗漏了函数的名称 打电话。