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

C 如何将结构的二进制文件加载到内存中,c,file,struct,malloc,fread,C,File,Struct,Malloc,Fread,我有一个二进制文件结构如下: struct sprite{ char name; unsigned int n; float coordinates[n][2]; } 我必须把它记在记忆里,(我不知道有多少人来了),这样我才能使用这些坐标 我有一个将这些结构带入内存的函数,我认为这是对的,但我的问题是,当我想导出到一个.txt文件时,我可以看到它是否加载良好,以及这个二进制文件是什么带来的,它不能正确地打印我 bool load_sprites(FILE *f,

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

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"); 
}

最明显的问题是字段“name”是一个字符,您似乎希望它是一个字符串(例如,您尝试使用%s打印它)。其次,由于结构的最后一个成员是一个可变大小的数组(这在C中是合法的),因此它的大小不计入结构大小,因此每个结构需要两次读取:一次读取最多n个字段,另一次读取n个浮点数组。最好将此信息读写为文本,而不是尝试二进制读取结构。打印功能是打印对象0的名称,然后是对象0坐标0,然后是对象1的名称,然后是对象0坐标1,然后是对象2的名称,然后是对象0坐标2。。。。“我不认为这是你想要它做的。”李丹尼尔克罗克:第二,你说得对。首先,“name”不是一个字符,而是一个字符串,就像“SHIP”。那么,你是对的,也许我需要进行两次读取,因为我无法将这些结构打印到一个.txt文件中,我分别尝试了代码,我在内存中加载得很好。我要试试看,thanks@LeeDanielCrocker我怎样才能把同一个结构读两遍?我需要以某种方式得到n,这样我就可以打印出跟随他的坐标。你不需要读结构两次:一次读得到结构的大小,然后第二次读得到结构本身。如果不进行第一次读取,您无法知道第二次读取需要多少字节。最明显的问题是字段“name”是一个字符,而您似乎希望它是一个字符串(例如,您尝试使用%s打印它)。其次,由于结构的最后一个成员是一个可变大小的数组(这在C中是合法的),因此它的大小不计入结构大小,因此每个结构需要两次读取:一次读取最多n个字段,另一次读取n个浮点数组。最好将此信息读写为文本,而不是尝试二进制读取结构。打印功能是打印对象0的名称,然后是对象0坐标0,然后是对象1的名称,然后是对象0坐标1,然后是对象2的名称,然后是对象0坐标2。。。。“我不认为这是你想要它做的。”李丹尼尔克罗克:第二,你说得对。首先,“name”不是一个字符,而是一个字符串,就像“SHIP”。那么,你是对的,也许我需要进行两次读取,因为我无法将这些结构打印到一个.txt文件中,我分别尝试了代码,我在内存中加载得很好。我要试试看,thanks@LeeDanielCrocker我怎样才能把同一个结构读两遍?我需要以某种方式得到n,这样我就可以打印出跟随他的坐标。你不需要读结构两次:一次读得到结构的大小,然后第二次读得到结构本身。如果不进行第一次读取,就无法知道第二次读取需要多少字节。
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