2014-11-21 22 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