【问题标题】:Read a binary file and store all data into array of structures读取二进制文件并将所有数据存储到结构数组中
【发布时间】:2011-06-15 17:39:22
【问题描述】:

我需要编写一个程序,它只是一个测量转换程序。 程序首先向用户询问二进制文件的名称(单位转换数据),打开文件,设置数组。

我的结构:

struct unit {               
    char name[NAME_LEN];        
    char abbrev[ABBREV_LEN];    
    char class[CLASS_LEN];                                      
    double standard;            
};

和我的功能:

int fread_units(int unit_max,struct unit units[], int *unit_sizep)
{
    FILE *filep;
    struct unit data;
    int i, status;
    char fullname[10];

    /* Gets database of units from file                                 */

    printf("Enter name of binary file> ");
    scanf("%s", fullname);
    strcat(fullname, ".bin");
    i = 0;
    filep = fopen(fullname, "rb");
    //fseek (filep , 0 , SEEK_END);
    for (status = fread(&data, sizeof( struct unit ), 1, filep);
         status == 1 && i < unit_max;
         status = fread(&data, sizeof( struct unit ), 1, filep)){
        units[i++] = data;
    }
    printf("\n%f", units[3].standard);
    /* Issue error message on premature exit                            */
    if (status == 0) {
        printf("\n*** Error in data format ***\n");
        printf("*** Using first %d datavalues ***\n",i);
    }
    else if (status != EOF) {
        printf("\n*** Error: too much data in file ***\n");
        printf("*** Using first %d data values ***\n", i);
    }

    /* Send back size of used portion of array                          */
    *unit_sizep = i;

    if(status == 4)
        status = 1;
    else if (status != EOF)
        status = 0;
    fclose(filep);

    return(status);
}

根据书中的说法,(fread(&amp;data, sizeof( struct unit ), 1, filep);) 足以将所有数据存储到一个结构中。

但这对我不起作用...

输出:

*** Error in data format ***
*** Using first 4 datavalues ***
To convert 25 kilometers to miles, you would enter
> 25 kilometers miles
    or, alternatively,
>   25 km mi
> 25 km mi
Attempting conversion of 25.0000 km to mi . . .
Unit kmnot in database

Enter a conversion problem or q to quit.
> 

我的units.bin文件;

miles                   mi          distance        1609.3
kilometers              km          distance        1000
yards                   yd          distance        0.9144
meters                  m           distance        1
quarts                  qt          liguid_volume   0.94635
liters                  l           liquid_volume   1
gallons                 gal         liquid_volume   .7854
millimeters             ml          liquid_volume   0.001
kilograms               kg          mass            1
grams                   g           mass            0.001
slugs                   slugs       mass            0.14594

【问题讨论】:

  • 等等,你的units.bin文件是text文件吗? standard字段是如何真正保存的?
  • 你的结构说最后一个字段是double,但你的文件包含一个数字的文本表示!您必须执行其他操作才能读取文本数字,然后将其转换为实际的双精度数。
  • 如何创建一个二进制文件来处理它?
  • 好吧 - 如果您对格式化的文本文件感到满意,您应该查看 fscanf() 进行格式化读取,而不是 fread()。
  • 如果你解决了你的问题,你应该把你的解决方案放在一个答案中并接受它。最好说明您需要进行哪些更改才能解决您的问题。

标签: c arrays structure binaryfiles


【解决方案1】:

我解决了我的问题。我使用以下代码创建了一个二进制文件。

#include <stdio.h>

#define NAME_LEN    30  
#define ABBREV_LEN  15  
#define CLASS_LEN   20  
#define MAX_UNITS   20  

struct unit {               
    char name[NAME_LEN];        
    char abbrev[ABBREV_LEN];    
    char class[CLASS_LEN];                                      
    double standard;            
};

int main(void)
{
    int i;
    struct unit unitp[MAX_UNITS];
    FILE *inp, *outp;
    inp = fopen("units.dat", "r");
    outp = fopen("units.bin", "wb");
    for(i=0;!feof(inp);i++){
        fscanf(inp, "%s%s%s%lf", unitp[i].name,
                                    unitp[i].abbrev,
                                    unitp[i].class,
                                    &unitp[i].standard);
    }
    fwrite(unitp, sizeof(struct unit ), i, outp);

    fclose(inp);
    fclose(outp);

    return(0);
}

还有我的 for 循环;

for (status = fread(&units[i++], sizeof( struct unit ), 1, filep);
     i < MAX_UNITS && !feof(filep);
     status = fread(&units[i++], sizeof( struct unit ), 1, filep)){
    //units[i++] = data;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多