2016-07-17 62 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语句中的空间似乎并不重要