输出中显示两次的值(C编程)

时间:2014-11-21 07:08:03

标签: c file

我写了一个程序,在单独的文件中打印奇数和偶数。我的节目是

#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?

3 个答案:

答案 0 :(得分:3)

当您在 过去文件末尾阅读时,

feoftrue

读取scanf(最后一个数字)的10操作不会设置eof位,因为您还没有尝试读取或超过文件末尾。循环再次运行,然后eof期间设置scanf位,但输出num之前的任何内容(最后一个数字),因此双输出

一种可能的解决方法是制作while循环while (true),并在feof之后立即进行fscanf检查,break如果是这样。

答案 1 :(得分:1)

fbreretoanswer的诊断准确无误。但是,规定的修复不太令人满意。

固定代码应为:

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;
}