2014-11-21 117 views
1

我编写了一个程序在单独的文件中打印奇数和偶数。我的计划是在输出中显示两次的值(C编程)

#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 

为什么我获得两个10S在偶数输出?

+0

[“while(!feof(file))”的可能重复始终是错误的](http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) – 2014-11-21 07:54:39

回答

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); 
3

feoftrue当你在或过去文件的读取结束

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

一个可能的解决将是使while循环while (true),使feof检查fscanf后,如果是这样break荷兰国际集团。

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

它好多了测试I/O函数(在这种情况下为'fscanf()')而不是使用'feof()'。在你已经发现一个问题来区分EOF和一个错误('ferror()'告诉你这是一个错误)后,你可以使用'feof()'。但这是'feof()'唯一合法的用法。循环控制或双重测试'feof()'最好是笨拙的,通常是错误的。 – 2014-11-21 08:37:31