【问题标题】:my binary file is always empty when i try to fill it with an array当我尝试用数组填充二进制文件时,它总是为空
【发布时间】:2021-01-04 00:10:10
【问题描述】:
typedef struct equipement_agricole{
char type[20];
char marque[20];
char modele[20];
char numero_serie[30];
char panne[20];
char status[20];
int nb_status;
int nb_panne;
}equipement_agricole;
typedef struct eq_util{
    char numero_s[30];
    char type_u[20];
    char marque_u[20];
    char modele_u[20];
    int nb_util;
    int ordre;
}eq_util;
typedef struct verif{
    char id[30];
    int nb;
}verif

void equipement_plus_util()
{
    FILE *f;
    FILE *g;
    int i=0;
    int taille=0;
    f=fopen("equipement.bin","rb");
    g=fopen("equipement_util.bin","wb");
    equipement_agricole E;
    eq_util U;
    while(fread(&E,sizeof(equipement_agricole),1,f)!=0)
    {
        taille+=1;
    }
    verif tab1[taille];
    while(fread(&E,sizeof(equipement_agricole),1,f)!=0)
    {
        strcpy(tab1[i].id,E.numero_serie); 
        tab1[i].nb=E.nb_status;
          i++;
    }
    int j,k;
    verif T;
    for(j=0;j<taille-1;j++)
    {
        for(k=j+1;k<taille;k++)
        {
            if(tab1[j].nb<tab1[k].nb)
            {
                strcpy(T.id,tab1[j].id);
                T.nb=tab1[j].nb;
                strcpy(tab1[j].id,tab1[k].id);
                tab1[j].nb=tab1[k].nb;
                strcpy(tab1[k].id,T.id);
                tab1[k].nb=T.nb;
            }
        }
    }
    int a; 
    for(a=0;a<taille;a++)
    {
        while(fread(&E,sizeof(equipement_agricole),1,f)!=0)
        {
            if(strcmp(tab1[a].id,E.numero_serie)==0)
            {
                strcpy(U.marque_u,E.marque);
                strcpy(U.modele_u,E.modele);
                strcpy(U.numero_s,E.numero_serie);
                strcpy(U.type_u,E.type);
                U.nb_util=E.nb_status;
                U.ordre=a+1;
                fwrite(&U,sizeof(eq_util),1,g);
            }
        }
    }
  fclose(f);
  fclose(g);
  
}

嗨,伙计们,我需要你的帮助我已经陷入这个问题 2 天了,我找不到解决方案,所以我的问题是 在我从equipement.bin bianry 文件中获取必要的信息并将其放入一个数组之后,我对该数组进行排序,然后我将数组放入我认为在equipement_util.bin 中排序但我总是发现它总是空的我试过我知道的每一个细节都谢谢你

【问题讨论】:

  • 请检查fopenfread 的返回值。检查fopen 没有返回NULLfread 检查!=0 不合适。
  • 进行基本调试。使用调试器单步执行您的代码。它应该向您显示第二个 fread 永远不会读取任何内容,并且永远不会进入 while 循环。这是因为在第一个循环之后文件指针已经在文件的末尾。使用rewind 回到起点。但是两次读取文件效率低下。使用fseekftell 获取文件大小,并从中计算记录数。
  • @kaylum 你的意思是当我从二进制文件中读取两次时,它会从第一次离开的位置获取指针 &amp;E 吗?
  • 每次调用fread,它都会从当前文件位置读取,然后移动文件位置。因此,在第一个 fread 循环之后,文件位置位于文件末尾。然后,当您再次调用 fread 时,它无法读取任何内容,因为它已经在文件末尾。
  • 关于; typedef struct verif{ char id[30]; int nb; }verif这缺少最后的分号;所以不编译\

标签: arrays c binaryfiles


【解决方案1】:

关于:

while(fread(&E,sizeof(equipement_agricole),1,f)!=0)
{
    taille+=1;
}
verif tab1[taille];
while(fread(&E,sizeof(equipement_agricole),1,f)!=0)

当第一个'while()'循环退出时,'文件指针'将位于文件末尾,所以第二个while()循环将立即退出。

解决这个问题:

在第一个while() 循环退出后,将“文件指针”重置为文件的开头。建议:

rewind( f );

以上将导致文件中的数据被设置到数组tab1[]

可能还有其他问题,但是上述更正将使您的代码朝着正确的方向开始

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多