微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

读取二进制文件并将所有数据存储到结构数组中

如何解决读取二进制文件并将所有数据存储到结构数组中

| 我需要编写一个简单的测量转换程序的程序。 该程序首先询问用户二进制文件名称单位转换数据),打开文件并设置数组。 我的结构:
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,SEEK_END);
    for (status = fread(&data,sizeof( struct unit ),1,filep);
         status == 1 && i < unit_max;
         status = fread(&data,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);
}
根据这本书,“ 2”足以将所有数据存储到一个结构中。 但这对我不起作用... 输出
*** 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
    

解决方法

        我解决了问题,并使用以下代码创建了一个二进制文件。
#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++],filep)){
    //units[i++] = data;
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。