2014-01-19 3 views
0

Я думал, что должен прочитать весь файл в программе, затем удалить файл и снова открыть его с тем же именем, после чего я должен использовать, например, функцию 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++; 


} 
} 
+2

Не стесняйтесь, покажите нам свой код. Нет другого способа понять, что именно вы хотите – Dabo

+0

Да .. Дабо правильно :) – MLSC

+0

Я использовал несколько слов, которые не написаны на английском языке, и я подумал, что это будет какая-то проблема для понимания;) – user3212526

ответ

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 декларацию и структуру.

Смежные вопросы