C程序:从文件读取和复制到结构?

时间:2016-07-17 02:54:31

标签: c file-io struct formatted-text

我正在为一个班级工作,我在应用文件输入/输出和结构时遇到了麻烦。我有这个代码从文件中读取不同的汽车并将其信息复制到结构数组中。

#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

我在我的代码中插入了一个打印功能,所以我可以看到汽车是否正常读取,但是当我运行程序时,这是输出:

▒▒▒800 1465899048 32767

我完全不知道为什么会这样。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

首先删除while()并放置if(!feof(pFile) && !ferror(pFile))。 在fscanf() for 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);

我希望这会对你有所帮助。