Удаления записи с бинарного файла по номеру с++

261
27 апреля 2017, 16:32

Почему - то не работает функция удаления. Вот код, что я пытался. Укажите на ошибку.

Добавляем запись в файл:

void dobavlenie()
{
    const char * kat_avto_l = "Легковая";
    const char * kat_avto_g = "Грузовая";
    const char * kat_garaga_m = "Металлический";
    const char * kat_garaga_k = "Кирпичный";
    vvod grg[100];
    int b, z, z_v, m, m_1, m_2, n, i = 0, dl;
    system("cls");
    kar = fopen("kar.bin", "ab");
    cout << "Сколько записей хотите добавить?\nВаш выбор:";
    cin >> n;
    while (i < n)
    {
        system("cls");
        getchar();
    m_2:
        system("cls");
        cout << "Меню добавления:\n\nФИО арендатора\nВвод:";
        //cin.getline(grg[i].fio, 24);
        gets_s(grg[i].fio);
    /*  if (strlen(grg[i].fio) == 0)
        {
            cout << "Ошибка №.Вы ввели пустой рядок."; goto m_2;
        }
        else
            for (int i = 0; grg[i].fio != '\0'; i++)
                if ((strpbrk(grg[i].fio, "\\/,()1234567890!@#$%^&*-+=_|")))
                {
                    cout << endl << "Ошибка №.Недопустимый символ.";
                    getchar();
                    goto m_2; 
                }*/
        system("cls");
        cout << "Меню добавления:\n\nСрок аренды гаража (месяц):\nВаш выбор:";
        cin >> grg[i].srok;
        system("cls");
    m:
        system("cls");
        cout << "Меню добавления:\n\nТип авто:\n1.Легковая.\n2.Грузовая.\nВаш выбор:";
        cin >> b;
        switch (b)
        {
        case 1:
            strcpy(grg[i].tip_avto, kat_avto_l);
            break;
        case 2:
            strcpy(grg[i].tip_avto, kat_avto_g);
            break;
        default:    goto m;
        }
        system("cls");
    m_1:
        system("cls");
        cout << "Меню добавления:\n\nТип гаража:\n1.Металлический.\n2.Кирпичный.\nВаш выбор:";
        cin >> z;
        switch (z)
        {
        case 1:
            strcpy(grg[i].tip_garaga, kat_garaga_m);
            z_v = grg[i].srok * 2500;
            grg[i].zagal_stom = z_v;
            break;
        case 2:
            strcpy(grg[i].tip_garaga, kat_garaga_k);
            z_v = grg[i].srok * 5000;
            grg[i].zagal_stom = z_v;
            break;
        default:    goto m_1;
        }
        system("cls");
        cout << "Меню добавления:\n\nМесто гаража (1-99):\nВаш выбор:";
        cin >> grg[i].mesto;
        system("cls");
        getchar();
        cout << "Меню добавления:\n\nИндивидуальный регистрационный знак.\nВаш выбор:";
        gets_s(grg[i].znak);
        system("cls");
        fwrite(&grg[i], sizeof(grg[i]), 1, kar);
        i++;
    }
    tmp += n;
    fclose(kar);
    cout << "Анкета заполнена:)\n";
    Sleep(1000);
    system("cls");
    glavnoemenu();

} Функция просмотра:

void shapka()
{
    S printf("ЙНННЛННННННННННННННННННННННННЛННННННННННЛНННННННННННННННЛНННННЛННННННННННННННННННЛНННННННННННННННННННННННННЛННННННННННННННННННННННННННННННННННН»");
    //printf("\n| № |     ФИО арендатора     | Тип авто |  Тип гаража  |Место|Индивид. рег. знак|Срок аренды гаража (мес.)|Общ. стоимость. аренды гаража (грн)|");
    R printf("\n");
    P printf(" № ");
    P printf("     ФИО арендатора     ");
    P printf(" Тип авто ");
    P printf("   Тип гаража  ");
    P printf("Место");
    P printf("Индивид. рег. знак");
    P printf("Срок аренды гаража (мес.)");
    P printf("Общ. стоимость. аренды гаража (грн)"); P
        S printf("\nМНННОННННННННННННННННННННННННОННННННННННОНННННННННННННННОНННННОННННННННННННННННННОНННННННННННННННННННННННННОННННННННННННННННННННННННННННННННННН№");
}

void prosmotr_delet()
{
    vvod grg;
    int i = 0, dlina = 0, n,m;
    int size = sizeof(struct vvod);
    kar = fopen("kar.bin", "rb");
    cout << "Меню просмотра:\n\n";
    rewind(kar);
    shapka();
    while (fread(&grg, size, 1, kar) == 1)
    {
        R printf("\n");
        P printf("%3i", i + 1);
        P printf("%-23s ", grg.fio);
        P printf("%-9s ", grg.tip_avto);
        P printf("%-14s ", grg.tip_garaga);
        P printf("%4i ", grg.mesto);
        P printf("%-18s", grg.znak);
        P printf("%25i", grg.srok);
        P printf("%35i", grg.zagal_stom); P
            S printf("\nМНННОННННННННННННННННННННННННОННННННННННОНННННННННННННННОНННННОННННННННННННННННННОНННННННННННННННННННННННННОННННННННННННННННННННННННННННННННННН№"); R
            i++;
    }
    S printf("\nИНННКННННННННННННННННННННННННКННННННННННКНННННННННННННННКНННННКННННННННННННННННННКНННННННННННННННННННННННННКННННННННННННННННННННННННННННННННННН\xBC\n"); R
        fclose(kar);

}

Функция удаления :

void delet_po_nomery()
{
    int num = 0,fst=0;
    char answ;
    cout << "Меню удаления:\n\n";
    prosmost_delete();
    cout << "\nВведите номер записи,которую хотите удалить.\nВаш выбор:";
    cin >> num;
    num--;
    kar = fopen("kar.bin", "rb");
    while (fread(&grg, sizeof(grg), 1, kar) == 1)
        fst++;
    if (num < fst && num >= 0)
    {
        cout << "Вы уверены, что хотите удалить" << num + 1 << "-ю запись из файла?(y/n):";
        fflush(stdin);
        cin >> answ;
        if (answ == 'y' || answ == 'Y' || answ == 'д' || answ == 'Д')
        {
            rewind(kar);
            temp = fopen("temp.bin", "wb");
            int i = 0;
            while (fread(&grg, sizeof(grg), 1, kar) == 1)
            {
                if (i != num)
                {
                    fwrite(&grg, sizeof(grg), 1, temp);
                    i++;
                }
            }
            fclose(temp);
            fclose(kar);
            temp = fopen("temp.bin", "rb");
            kar = fopen("kar.bin", "wb");
            while (fread(&grg, sizeof(grg), 1, kar) == 1) fwrite(&grg, sizeof(grg), 1, temp);
            cout << "Запись под номером " << num + 1 << "успешно удалена!";
            fclose(temp);
            remove("temp.bin");//Удаления файла temp
        }
        else
            cout << "К сожалению не удалось удалить запись";
    }
    else
        cout << "Ошибка №.Некоректный номер записи";
    fclose(kar);
    getchar();
}
READ ALSO
Quick Sort. C++

Quick Sort. C++

Доброго времени сутокИзучаю алгоритмы и в качестве задания реализовал быструю сортировку(см

365
Заполнение списка из файла

Заполнение списка из файла

Здравствуйте, возник вопрос как заполнить список из файлаИмеется структура, список двусвязный

263
Как вернуть меню [требует правки]

Как вернуть меню [требует правки]

Как вернуть меню что снизу экрана (Компилятор Ресурсы Журнал Компиляции) в Dev C++

343