我有一个简单的程序可以从文本文件(num.txt)中读取。文本文件的每行数字为1 2 3 4 5。当我运行程序时,它会打印5次。任何人都能告诉我为什么会发生这种情况,以及如何解决这个问题?提前谢谢
int main(void)
{
int number;
FILE *file;
int i = 0;;
file = fopen("num.txt", "r");
while (!feof(file)){
fscanf(file, "%d", &number);
printf("%d\n", number);
}
return 0;
}
这是我的文本文件num.xtx
1
2
3
4
5
这是程序输出
1
2
3
4
5
5
还有额外的5
答案 0 :(得分:7)
从scanf
函数系列的手册页
如果之前到达输入结尾,则返回值
EOF
要么是第一次成功转换,要么是匹配失败。 如果发生读取错误,也会返回EOF
,在这种情况下会出现错误 设置流的指示符,并设置errno
以指示 错误。
这意味着上一次成功的fscanf
调用会从流file
中读取最后一行,之后while
循环条件!feof(file)
为真,因为文件结束条件还没有实现。这意味着循环执行一次额外的时间,并再次打印变量number
的先前值。
请阅读此内容 - while(!feof(file))
is always wrong
您应该检查scanf
的返回值,而不是检查文件流上的文件结束指示符。
#include <stdio.h>
int main(void) {
int number;
FILE *file = fopen("num.txt", "r");
// check file for NULL in case there
// is error in opening the file
if(file == NULL) {
printf("error in opening file\n");
return 1;
}
// check if fscanf call is successful
// by checking its return value for 1.
// fscanf returns the number of input
// items successfully matched and assigned
while(fscanf(file, "%d", &number) == 1)
printf("%d\n", number);
return 0;
}
答案 1 :(得分:5)
第二次fscanf
失败并且没有向number
写任何内容,这就是为什么它最后一次仍为5的原因。要知道fscanf
是否成功,您必须检查其返回值。
fscanf
返回它写入的参数数量。在你的情况下,如果它返回1,它工作;如果它返回0,它就没有了。这是您应该检查的,而不是feof
。
while (fscanf(file, "%d", &number) == 1)
{
printf("%d\n", number);
}