如何删除二进制文件中的元素?

时间:2014-01-19 18:52:05

标签: c file binary structure element

我认为我应该将所有文件读入程序,然后删除文件并再次使用相同的名称打开,之后我应该使用例如函数for if(!strcmp(.,.))我应该fwrite每个元素从结构。我已经尝试过各种方式,但它没有用。有人可以帮我吗?我将非常感激。

void usun_element()
{
    int i;
    char nazwa[100];
    FILE *fp;
    if((fp=fopen("katalog.bin", "rb" ))==NULL)
    {
        printf("Brak pliku katalog na dysku.\n");
        return;
    }
    else
    printf("Wpisz nazwe, ltora chcesz usunac z listy: ");
    scanf("%s", &nazwa);
        otworz();
        remove("katalog.bin");
        otworz();
        i=0;
        while(i<ost)
        {

        if(!strcmp(nazwa,kat[i].nazwa))
            {
                fwrite(&kat[i].nazwa, sizeof(kat), 1, fp);
                fwrite(&kat[i].typ, sizeof(kat), 1, fp);
                fwrite(&kat[i].rodzaj, sizeof(kat), 1, fp);
                fwrite(&kat[i].posiadane, sizeof(kat), 1, fp);
            }
    else
    {
        ost=i-1;
    }
    i++;


}
}

1 个答案:

答案 0 :(得分:1)

将格式说明符与参数匹配 使用正确的sizeof()。
可疑ost=i-1;。也许不需要。

static const char *EnterNameToDelete = "Wpisz nazwe, ltora chcesz usunac z listy: ";
fputs(EnterNameToDelete, stdout);
// scanf("%s", &nazwa);
scanf("%99s", nazwa); // drop the &

if(!strcmp(nazwa, kat[i].nazwa)) {
  // use the correct sizeof()
  if (fwrite(&kat[i].nazwa    , sizeof(kat[i].nazwa)    , 1, fp) == 0 ||
      fwrite(&kat[i].typ      , sizeof(kat[i].typ)      , 1, fp) == 0 ||     
      fwrite(&kat[i].rodzaj   , sizeof(kat[i].rodzaj)   , 1, fp) == 0 ||
      fwrite(&kat[i].posiadane, sizeof(kat[i].posiadane), 1, fp)) {
    Handle_IO_Error();
  }
}

如果OP发布了kat声明和结构,那将会有所帮助。