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

printf/scanfをループの外に移動し、while(fread(...)) { ... }代わりに使用しますdo { ... } while(fread(...))(id をチェックするのは無意味で、ファイルから何かを読み取る前に書き込む可能性があります)。

于 2012-06-07T08:21:57.953 に答える
0

以下を実装して、少なくとも何が起こるかを確認してください。この場合、バイナリから読み込まれた構造体ごとに新しい ID を取得して比較するのではなく、プログラムは 1 つの 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 に答える