我有以下简单的程序从文本文件(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;
}
Run Code Online (Sandbox Code Playgroud)
这是我的文本文件num.xtx
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
这是程序输出
1
2
3
4
5
5
Run Code Online (Sandbox Code Playgroud)
额外5
从scanf函数族的手册页,
EOF如果在第一次成功转换或匹配失败发生之前达到输入结束,则返回该值.EOF如果发生读取错误,也会返回,在这种情况下,将设置流的错误指示符,并将errno其设置为指示错误.
这意味着最后一次成功fscanf调用从流中读取最后一行,file之后while循环条件!feof(file)为真,因为尚未满足文件结束条件.这意味着循环执行一次额外的时间,并number再次打印变量的先前值.
请读一下 - while(!feof(file))总是错的
您应该检查返回值,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;
}
Run Code Online (Sandbox Code Playgroud)
第二次fscanf失败,并没有写任何东西number,这就是为什么它仍然是最后一次5.要知道是否fscanf成功,您必须检查其返回值.
fscanf返回它写入的参数数量.在你的情况下,如果它返回1,它工作; 如果它返回0,则不会.这是你应该检查而不是feof.
while (fscanf(file, "%d", &number) == 1)
{
printf("%d\n", number);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6899 次 |
| 最近记录: |