1 Востаннє редагувалося apolof (16.11.2014 00:50:53)

Тема: видалення

Як правильно видалити певний рядок(запис) з файлу, якщо я знаю
його номер?

void film_delete()
{    
    FILE *f; 
    FILE *p; 
    int k = 0;
    int s;
    printf("Введіть номер запису який потрібно видалити: "); scanf("%d", &s);
    f = fopen(FName, "rb");
    p = fopen("baza1.txt", "wb");
    for(int i=0; i<file_element(); i++)
        if (s != shop[i].id)
        {
            fwrite(&shop, sizeof(films), 1, p);
        }
    
    fclose(f);
    fclose(p);
    
    f = fopen(FName, "wb");
    p = fopen("baza1.txt", "rb+");
    while (fread(&shop, sizeof(films), 1, p))
    {
        fwrite(&shop, sizeof(films), 1, f);
    }
    fclose(f);
    fclose(p);
}

2 Востаннє редагувалося Chemist-i (16.11.2014 00:47:47)

Re: видалення

А "правиль" чого не виправили?

3

Re: видалення

Якщо це С++ то є String:Erase
А для простого С ціле діло.

Подякували: apolof1

4

Re: видалення

А якщо з структури видаляти?

5

Re: видалення

apolof написав:

А якщо з структури видаляти?

В сенсі частину структури, чи як?

6

Re: видалення

Chemist-i написав:
apolof написав:

А якщо з структури видаляти?

В сенсі частину структури, чи як?

Потрібно видалити цілий запис, по номеру запису

Post's attachments

Безымянный.png 18.95 kb, 192 downloads since 2014-11-16 

7 Востаннє редагувалося Chemist-i (16.11.2014 02:54:14)

Re: видалення

Ви ж не весь код показуєте, що за shop[ i ]?, ну я сі здогадав, що масив із записами (нещодавно як раз сі займав налаштуванням атсральної антени), мабуть видаляти треба просто записуючи до файлу не все, тобто:
цикл
якщо i == %запис, який треба видалити% то нічого не робимо,
інакше - пишемо послідовно.

Подякували: apolof1

8 Востаннє редагувалося koala (16.11.2014 11:33:40)

Re: видалення

Видаляти з файлу стандартними засобами C не можна. Можна тільки перезаписати запис фіксованого розміру чи створити новий файл.
В конкретних ОС є власні функції, на кшталт truncate/ftruncate в POSIX чи _chsize/_chsize_s в Windows; але вони тільки зменшують розмір файлу, і доведеться все одно перезаписати на місце видаленого інший запис з кінця (або зсунути всі записи на один).

Подякували: apolof1