我写了一个程序,在单独的文件中打印奇数和偶数。我的节目是
#include<stdio.h>
int main()
{
FILE *f1,*f2,*f3;
int n,i,num;
f1 = fopen("number.txt","w");
printf("Enter the number:");
scanf("%d",&n);
for(i=1;i<=n;i++)
fprintf(f1,"%d ",i);
fprintf(f1,"\n");
fclose(f1);
f1 = fopen("number.txt","r");
f2 = fopen("even.txt","w");
f3 = fopen("odd.txt","w");
fprintf(f2,"Even numbers:\n");
fprintf(f3,"Odd numbers:\n");
while(!feof(f1)){
fscanf(f1,"%d",&num);
if(num%2 == 0)
fprintf(f2,"%d ",num);
else
fprintf(f3,"%d ",num);
}
fclose(f1);
fclose(f2);
fclose(f3);
return 0;
}
输出
Enter the number:10
$ cat number.txt
1 2 3 4 5 6 7 8 9 10
$ cat even.txt
Even numbers:
2 4 6 8 10 10
$ cat odd.txt
Odd numbers:
1 3 5 7 9
为什么我在偶数输出中得到两个10?
答案 0 :(得分:3)
feof
为true
。
读取scanf
(最后一个数字)的10
操作不会设置eof
位,因为您还没有尝试读取或超过文件末尾。循环再次运行,然后在eof
期间设置scanf
位,但输出num
之前的任何内容(最后一个数字),因此双输出
一种可能的解决方法是制作while循环while (true)
,并在feof
之后立即进行fscanf
检查,break
如果是这样。
答案 1 :(得分:1)
fbrereto中answer的诊断准确无误。但是,规定的修复不太令人满意。
固定代码应为:
while (fscanf(f1, "%d", &num) == 1)
{
if (num % 2 == 0)
fprintf(f2, "%d ", num);
else
fprintf(f3, "%d ", num);
}
putc('\n', f2);
putc('\n', f3);
答案 2 :(得分:0)
以下是按照您的预期工作,而且只有一行更多,尽管我不确定它是最好也是最干净的方式:
//
// main.c
// evenOdd
//
#include<stdio.h>
int main() {
FILE *f1,*f2,*f3;
int n,i,num;
f1 = fopen("number.txt","w");
printf("Enter the number:");
scanf("%d",&n);
for(i=1;i<=n;i++)
fprintf(f1,"%d ",i);
fprintf(f1,"\n");
fclose(f1);
f1 = fopen("number.txt","r");
f2 = fopen("even.txt","w");
f3 = fopen("odd.txt","w");
fprintf(f2,"Even numbers:\n");
fprintf(f3,"Odd numbers:\n");
for (i=1; !feof(f1); ++i) {
fscanf(f1, "%d", &num);
if (feof(f1) != 0) {return 0;} else // check if EOF
if (num%2 == 0) {
fprintf(f2, "%d ", num);
} else fprintf(f3, "%d ", num);
}
fclose(f1);
fclose(f2);
fclose(f3);
return 0;
}