我认为我应该将所有文件读入程序,然后删除文件并再次使用相同的名称打开,之后我应该使用例如函数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++;
}
}
答案 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
声明和结构,那将会有所帮助。