2013-10-07 56 views
1

我必須製作一個用C語言編寫的程序,它將讀取和打印文本文件中的一些內容。從文本文件中讀取和打印

但是下面的程序的2個函數由於某種原因不會工作。案例3正常工作。但另外兩個打印沒有或只有1個名字。這怎麼可能,我該如何解決這個問題。

我沒有得到任何錯誤順便說一句。

#include <stdio.h> 

main() 
{ 
    FILE *list; 
    int number, menu, total; 
    char name[20]; 

    list = fopen("C:\\PATH\\TO\\FILE", "r"); 

    printf("Menu: \n"\n); 
    printf("[1] Positive total: \n"); 
    printf("[2] Negative total: \n"); 
    printf("[3] Total: \n"); 
    printf("[4] Quit \n\n"); 
    printf("Choose: 1,2,3 or 4:\n"); 
    scanf("%d", &menu); 

while (menu!=4) 
{ 
     fscanf(list, "%d%s%d", &number, name, &total); 
     switch(menu) 
     { 
        case 1: printf("Negative total \n"); 
          while(!feof(list)) 
          { 
           if (total<0) 
           { 
             printf("-%6d%-15s%6d\n", number, name , total); 
             fscanf(list, "%d%s%d", &number, name, &total); 
           } 
          } 
          break; 

        case 2: printf("Positive: \n"); 
          while(!feof(list)) 
          { 
           if (total>=0) 
           { 
             printf("-%6d%15s%6d\n", number, name , total); 
             fscanf(list, "%d%s%d", &number, name, &total); 
           } 
          } 
          break; 

        case 3: printf("Total: \n"); 
          while(!feof(list)) 
          { 
           printf("-%6d%15s%6d\n", number, name , total); 
           fscanf(list, "%d%s%d", &number, name, &total); 
          } 
          break; 
     } 

     rewind(list); 
     printf("\nChoose again, 1, 2, 3, 4: "); 
     scanf("%d", &menu); 
     } 
     printf("End of Program"); 
     fclose(list); 

     return 0; 
} 

文本文件包含數字,名字,他們總計金額(你可以把它看作是銀行的系統)。這裏是文本文件:

5892 John +7250 
5893 Kate -94 
5894 Mike +324 
5895 Jack +9570 
5896 Anne +800 

回答

0

你必須在這兩個案例1和2的無限循環的情況在案例1中,這樣的:

if (total<0) 
{ 
    printf("-%6d%-15s%6d\n", number, name , total); 
    fscanf(list, "%d%s%d", &number, name, &total); 
} 

應該不是,是:

if (total<0) 
{ 
     printf("-%6d%15s%6d\n", number, name , total); 
} 
fscanf(list, "%d%s%d", &number, name, &total); 

否則,您每次讀取積極的金額時都會卡住:總數將大於等於0,因此您不會輸入if塊,並且您從不執行fscanf()調用以繼續讀取文件。循環期望達到文件的結尾,但你永遠不會達到它,因爲你沒有向前閱讀,你剛剛停止。

同樣的情況,對於情況2:你要調用scanf函數的if塊之外,像這樣:

if (total>=0) 
{ 
     printf("-%6d%15s%6d\n", number, name , total); 
} 
fscanf(list, "%d%s%d", &number, name, &total); 

此外,您發佈第11行不編譯代碼(你的printf( 「菜單:\ n」。\ n)的,即,以一個換行符出字符串的請嘗試在未來提供編譯代碼

這裏有一個工作版本:

#include <stdio.h> 

int main() 
{ 
    FILE *list; 
    int number, menu, total; 
    char name[20]; 

    list = fopen("example", "r"); 

    printf("Menu: \n\n"); 
    printf("[1] Positive total: \n"); 
    printf("[2] Negative total: \n"); 
    printf("[3] Total: \n"); 
    printf("[4] Quit \n\n"); 
    printf("Choose: 1,2,3 or 4:\n"); 
    scanf("%d", &menu); 

while (menu!=4) 
{ 
     fscanf(list, "%d%s%d", &number, name, &total); 
     switch(menu) 
     { 
        case 1: printf("Negative total \n"); 
          while(!feof(list)) 
          { 
           if (total<0) 
           { 
             printf("-%6d%15s%6d\n", number, name , total); 
           } 
           fscanf(list, "%d%s%d", &number, name, &total); 
          } 
          break; 

        case 2: printf("Positive: \n"); 
          while(!feof(list)) 
          { 
           if (total>=0) 
           { 
             printf("-%6d%15s%6d\n", number, name , total); 
           } 
           fscanf(list, "%d%s%d", &number, name, &total); 
          } 
          break; 

        case 3: printf("Total: \n"); 
          while(!feof(list)) 
          { 
           printf("-%6d%15s%6d\n", number, name , total); 
           fscanf(list, "%d%s%d", &number, name, &total); 
          } 
          break; 
     } 

     rewind(list); 
     printf("\nChoose again, 1, 2, 3, 4: "); 
     scanf("%d", &menu); 
     } 
     printf("End of Program"); 
     fclose(list); 

     return 0; 
} 

最後的一些言論:我會說t爲fopen()的返回值,以確保文件已成功打開。您可能還想在循環條件下使用ferror()執行一些錯誤檢查。最後,確保你的「名稱」緩衝區足夠大,20個字符不是很大。對於一個安全的程序,你應該使用fgets(name,19,stdin)來代替,然後用null結束字符串。

+0

另請注意,使用'feof()'可能導致最後一行被重複,因爲當您讀取文件的最後一個字節時EOF條件未設置,但當您嘗試讀取*之後的字節* – twalberg

相關問題