2016-12-25 134 views
1

我有一個名爲「TEST.txt」的輸入數據文件。它包含身份證號碼,姓名,十個學生的三個不同的考試成績。我試圖製作一個程序,讀取這些輸入數據,計算每個學生的考試平均值,然後將平均值大於等於45.5的學生的ID號,姓名,平均值重新寫入名爲「RESULT.TXT」的輸出文件「使用結構。 我想我能夠用我定義的結構來讀取我的輸入數據。我想知道如何才能找到考試的平均值(一,二和三),設置寫入平均值的條件以及將ID,名稱和平均值寫入RESULTS.TXT。 這是我的代碼,直到現在。使用結構讀取文件,計算和寫入另一個

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <string.h> 
typedef struct student{ 
    char name[30]; 
    int id; 
    int exam1; 
    int exam2; 
    int exam3; 




}STUDENT; 



int main(){ 
    int sum=0; 
    int i=0; 
    double mean[10]; 


    STUDENT test[10]; 
    FILE *fRead; 


    fRead=fopen("TEST.txt","r+"); 
    if((fRead=fopen("TEST.txt","r"))==NULL){ 
     printf("File could not be opened\n");  
    } 

    while(!feof(fRead)){ 


      fscanf(fRead,"%d%s%d%d%d",&(test[i].id),test[i].name,&(test[i].exam1),&(test[i].exam2),&(test[i].exam3)); 


      printf("\n%s\n",test[i].name); 

      i++;  
    } 

    return 0; 
} 
+1

請看[爲什麼「while(!feof(file))」總是錯的?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)寫這個循環是'while(fscanf(...) == 5){printf(「%s \ n」,test [i] .name);我++; }' –

+0

我會檢查出來,但爲什麼條件== 5 ?! – utdlegend

+1

請閱讀[手冊頁](https://msdn.microsoft.com/en-us/library/cb5kac8b.aspx)for'fscanf',然後再採取一步。 –

回答

0

以下代碼:

  1. 是執行所希望的功能的一個可能的方式:
  2. 完全編譯
  3. 使用fscanf()函數正確
  4. 不使用不希望的功能feof()
  5. 是適當地評價
  6. 執行適當的錯誤檢查
  7. 不包括不必要的頭文件
  8. 將處理任何數量的學生在輸入文件中的,包括0學生

和現在的代碼

#include <stdio.h> // fopen(), fscanf(), fclose() 
#include <stdlib.h> // exit(), EXIT_FAILURE 

#define MAX_NAME_LEN (29) 

struct student 
{ 
    char name[MAX_NAME_LEN+1]; // +1 to allow for NUL terminator byte 
    int id; 
    int exam1; 
    int exam2; 
    int exam3; 
}; 

int main(void) 
{ 
    struct student test; 

    FILE *fRead = NULL; 
    FILE *fWrite = NULL; 

    if((fRead=fopen("TEST.txt","r"))==NULL) 
    { 
     perror("fopen for read of Test.txt failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fopen successful 

    if((fWrite = fopen("RESULT.TXT", "w")) == NULL) 
    { 
     perror("fopen for write of RESULT.TXT failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fopen successful 

    while(5 == fscanf(fRead,"%d %" MAX_NAME_LEN "s %d %d %d", 
      &(test.id), 
      test.name, 
      &(test.exam1), 
      &(test.exam2), 
      &(test.exam3))) 
    { 
     printf("\n%s\n",test.name); 

     float sum = (float)test.exam1 + test.exam2 + test.exam3; 
     float mean = sum/3.0f; 

     if(45.5f < mean) 
     { 
      fprintf(fWrite, "%d %s %d %d %d %2.2f\n", 
       test.id, 
       test.name, 
       test.exam1, 
       test.exam2, 
       test.exam3, 
       mean); 
     } // end if 
    } // end while 

    fclose(fRead); 
    fclose(fWrite); 

    //return 0; == not needed when returning from 'main' and value is zero 
} // end function: main 
+0

謝謝它完美的工作,但我不得不寫回傳0 ;雖然:) – utdlegend

+0

@utdlegend,因爲它'工作完美',請選擇這個答案。如果你不得不聲明:'return 0;'那麼我可以詢問編譯器你的使用和它的'版本號?我知道(至少)自C99標準以來,該聲明是不需要的。 – user3629249

0

我已經對你所編寫的代碼, 1.我已經使用環代替的結構的陣列的幾個變化,常量定義學生掃描的數目。

  • 我已經創建了一個FOUT指針的Result.txt,我在附加模式打開。

  • 我創建了一個條件,如果平均值> 45.5,學生的詳細信息將打印在RESULT.txt中。

    P.S.我在測試文件中用1個輸入檢查了程序。測試它與多個線路輸入,應該工作正常。

    #include <stdio.h> 
    #include <stdlib.h> 
    
    //constant for number of students, can be changed according to requirement 
    #define numOfStudents 10 
    
    typedef struct student{ 
    char name[30]; 
    int id; 
    int exam1; 
    int exam2; 
    int exam3; 
    }STUDENT; 
    
    int main(){ 
        double sum=0; 
        int i=0; 
        double mean; 
    
        STUDENT test; 
        FILE *fRead; 
    
        //File pointer for output 
        FILE * fOut; 
    
        //File for output in append mode 
        fOut = fopen("RESULT.txt", "a+");  
    
    
        fRead=fopen("TEST.txt","r+"); 
    
        if(fRead == NULL) 
        { 
         printf("File could not be opened\n");  
        } 
    
        //check if the file is successfully opened for appending 
        if(fOut == NULL) 
        { 
         printf("File could not be opened for printing\n"); 
        } 
    
    
        for(i; i < numOfStudents; i++) 
        { 
         fscanf(fRead,"%d%s%d%d%d",&(test.id),test.name,&(test.exam1), &(test.exam2), &(test.exam3)); 
         //calculates mean 
         sum = test.exam1 + test.exam2 + test.exam3; 
         mean = sum/3.0; 
    
         //Condition for mean to be printed to output file 
         if(mean > 45.5)    
         { 
          fprintf(fOut, "%d %s %d %d %d", (test.id),test.name, (test.exam1),(test.exam2),(test.exam3)); 
          fprintf(fOut, "\n"); 
         } 
    
         if(feof(fRead)) 
         { 
          break; 
         } 
        } 
        fclose(fRead); 
        fclose(fOut); 
        return 0; 
    } 
    
  • +0

    此答案嘗試訪問無法打開的文件。所以這個答案是錯誤的。這個答案無法檢查對'fscanf()的調用結果,所以即使調用失敗也會繼續。這個答案在計算變量「mean」時執行隱式轉換,並且由於是整數除法而截斷結果。函數:'fprintf()'是'昂貴'的,被稱爲不必要的次數。代碼縮進不一致。 – user3629249

    +0

    這個答案包括頭文件:'string.h'和'math.h'。這些頭文件的內容都沒有被使用,所以不應該包括在內。 – user3629249

    +0

    格式說明符'%s'使代碼容易受到未定義行爲的影響(如果名稱長度超過29個字符)\ – user3629249

    相關問題