0

您好,我的问题如下;

我有这个结构

struct item{
    char id[5];
    int ing[10];
    float qtd[10];
};

我有一个包含信息的二进制文件,我想删除一个选定的 id,我试过了

int remove(){   
    FILE *origem;
    FILE *copia;
    char menu[10];
    struct item aux;
    origem=fopen("menu.bin","rb");
    copia=fopen("temp.bin","wb");
    if(origem==NULL || copia==NULL)
        return;

    do{

        printf("name to delete");
        scanf("%s",&menu);

        if(stricmp(menu,aux.id)!=0)
            fwrite(&aux,sizeof(aux),1,copia);

    }while(fread(&aux,sizeof(aux),1,origem)==1);

    fclose(origem);
    fclose(copia);
    remove("menu.bin");
    rename("temp.bin","menu.bin");

}

你能帮助我吗?我想复制除我选择的 ID 之外的其他内容。提前致谢。

4

2 回答 2

0

尝试实施以下内容,至少看看会发生什么。在这种情况下,您的程序将只接受 1 个 ID 来尝试从二进制文件中删除,而不是获取一个新 ID 来比较从二进制文件中读取的每个结构。

int remove(){   
    FILE *origem;
    FILE *copia;
    char menu[10];
    struct item aux;
    origem=fopen("menu.bin","rb");
    copia=fopen("temp.bin","wb");
    if(origem==NULL || copia==NULL)
        return;

    printf("name to delete");
    scanf("%s",&menu);

    // to read first record into struct aux
    fread(&aux,sizeof(aux),1,origem);

    do{

        if(stricmp(menu,aux.id)!=0)
            fwrite(&aux,sizeof(aux),1,copia);

    }while(fread(&aux,sizeof(aux),1,origem)==1);

    fclose(origem);
    fclose(copia);
    remove("menu.bin");
    rename("temp.bin","menu.bin");
}
于 2012-06-07T05:27:48.857 回答
0

printf/的scanf东西移到循环之外,使用while(fread(...)) { ... }而不是do { ... } while(fread(...))(在从文件中读取内容之前检查 id 并可能写入是毫无意义的)。

于 2012-06-07T08:21:57.953 回答