如何将结构的二进制文件加载到内存中

时间:2019-06-17 23:21:04

标签: c file struct malloc fread

我有一个结构如下的二进制文件:

struct sprite{
     char name;
     unsigned int n;
     float coordinates[n][2];
}

我必须将其保存在内存中(我不知道有多少个),所以我可以使用这些坐标。

我有将这些结构携带到内存中的函数,我认为这是正确的,但是我的问题是,当我想导出到.txt文件时,可以看到它是否加载正确并查看是什么导致了该二进制文件,它无法正确打印我。

bool load_sprites(FILE *f, size_t *n, sprites_t **v){
    size_t alloc_size;
    sprites_t s;
    sprites_t *aux;
    if((*v = malloc(sizeof(sprites_t) * INIT_CHOP)) == NULL)
        return false;
    *n = 0;
    alloc_size = INIT_CHOP;
    while(fread(&s,sizeof(s),1,f)){
        if(*n == alloc_size){
            if((aux = realloc(*v,alloc_size * INIT_CHOP *sizeof(sprites_t)))==NULL){
                free(*v);
                *n=0;
                return false;
            }
            *v = aux;
            alloc_size *= INIT_CHOP;
        }
        memcpy(&(*v)[(*n)++],&s,sizeof(s)); 
    }
    return true;
}

我对该函数的调用是:

load_sprites(f,&n,&ptr):

然后,使用以下命令将其打印到.txt中:

 for(size_t i = 0; i<n; i++){
  fprintf(fo,"%s ",(ptr+i)->name);
    for(size_t j=0;j<2;j++){
      fprintf(fo,"%.2f  ",ptr->coordinates[i][j]);
    }
    fprintf(fo,"\n\t"); 
}

我需要用它来打印文件的所有内容,对象名称及其坐标。它仅向我输出前三个对象,并且一些坐标正确,而另一些错误:

SHIP -4.00  -6.00  
     4.00  -10.00  
     8.00  14.00  
     0.00  -10.00  
    ST -8.00  -6.00  
     -4.00  229010374656.00  
    ROCK1 0.00  0.00  
     -6.00  -4.00  
     -14.00  0.00  
     -6.00  4.00  
     12799826.00  0.00  
     0.00  0.00  
     0.50  0.50  
     1.00  1.00  
     0.50  0.75  
     0.00  1.00

0 个答案:

没有答案