2016-07-17 64 views
1

我正在爲一個類進行作業,並且在應用文件輸入/輸出和結構時遇到了麻煩。我有這個代碼從一個文件讀取不同的汽車,並將他們的信息複製到一個結構數組中。C程序:從文件讀取並複製到結構?

#include <stdio.h> 

#define MAX_LEN 1000 
#define NAME_LEN 30 

struct car{ 
    char make[NAME_LEN + 1]; 
    char model[NAME_LEN + 1]; 
    int year; 
    int cmpg; 
    int hmpg; 
    int avgmpg; 
}; 
. 
. 
. 
int main() 
{ 
    int i; 

    struct car cars[MAX_LEN]; 

    FILE* pFile; 
    pFile = fopen("cars.txt", "r"); 

    . 
    . 
    . 
    . 

    for(i = 0; i < MAX_LEN; i++) 
    { 
     while(!feof(pFile) && !ferror(pFile)) 
      { 
      fscanf(pFile, "%s%s%d%d%d ", cars[i].make, cars[i].model, &cars[i].year, &cars[i].cmpg, &cars[i].hmpg); 
      cars[i].avgmpg = (cars[i].cmpg + cars[i].hmpg)/2; 
     } 
    } 

    selection_sort(cars, MAX_LEN); 

    FILE* outFile; 
    outFile = fopen("sorted_cars.txt", "w"); 

    fprintf(outFile, "Make  Model year city mpg highway mpg average mpg\n"); 

    for(i = 0; i < MAX_LEN; i++); 
    { 
     fprintf(outFile, "%s %s %d %-2d %-10d %-12d\n", cars[i].make, cars[i].model, cars[i].year, cars[i].cmpg, cars[i].hmpg, cars[i].avgmpg); 
     printf("%s %s %d %d %d %d\n", cars[i].make, cars[i].model, cars[i].year, cars[i].cmpg, cars[i].hmpg, cars[i].avgmpg); 
    } 


    fclose(pFile); 
    fclose(outFile); 
    return 0; 
    } 

這是.txt文件的樣子:

Mercury Sable 2009 18 28 
Jeep Wrangler 2016 17 21 
Honda Civic 2015 31 41 
Toyota Corolla 2015 30 42 
Toyota Prius 2010 51 48 
Ford Escape 2013 23 33 
Ford Fusion 2013 25 37 
Acura MDX 2014 20 28 
Lexus RX 2013 32 28 

我插入打印功能到我的代碼,所以我可以看到,如果汽車正確讀取,但是當我運行該程序,這是輸出:

▒▒▒80 0 1465899048 32767

我絕對不知道爲什麼會這樣。任何人都可以幫忙嗎?

+0

'爲(i = 0; I BLUEPIXY

+0

我懷疑你的scant在字段說明符之間應該有空格,例如:「%s%s%s ...「 –

+0

您正在期待'feof'來預測未來的行動是否會成功。這不是它所做的。你不檢查'fscanf'是否成功或失敗。 –

回答

0

先刪除while()並放if(!feof(pFile) && !ferror(pFile))。 在您的fscanf()中爲cars文件在類型說明符之間放置空格。 它應該是這樣的

fscanf(pFile, "%s %s %d %d %d", cars[i].make, cars[i].model, &cars[i].year, &cars[i].cmpg, &cars[i].hmpg); cars[i].avgmpg = (cars[i].cmpg + cars[i].hmpg)/2; 

,並直接寫入文件之前,先打印控制檯struct值只,以及是否得到它以適當的方式與否。

和上次修改是 如果不使用此

fprintf(outFile, "%s %s %d %-2d %-10d %-12d\n", cars[i].make, cars[i].model, cars[i].year, cars[i].cmpg, cars[i].hmpg, cars[i].avgmpg); 

使用此

fprintf(outFile, "%s %s %d %d %d %d\n", cars[i].make, cars[i].model, cars[i].year, cars[i].cmpg, cars[i].hmpg, cars[i].avgmpg); 

我希望這會幫助你。

0

而從文件中讀取的

for(i = 0; i < MAX_LEN; i++) { 
    while(!feof(pFile) && !ferror(pFile)) { 
     /* Read */ 
    } 
} 

,而不是做這樣的事情

int i=0; 
while(!feof(pFile) && !ferror(pFile) && i < MAX_LEN) {  
    /* Read */ 
    i++; 
} 

你輸入之後第二for聲明分號,將其刪除。

int total = i; 
for(i = 0; i < total; i++) { 
    /* Write to another file and stdout*/ 
} 

它應該工作。

注意: 在fscanf語句中的空間似乎並不重要