1

Тема: Видалення рядка за номером

Добрий вечір!
Маю завдання розробити програму для інтернет магазину ноутбуків.
Останнє, що залишилося це видалення записів з таблиці (за порядковим номером).
Написав таку функцію, але вона не працює.

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <cmath>
#include <fstream>
#include <windows.h>
#include <iomanip>

using namespace std;

struct MAG {
    char nazva[25];
    int type1;
    int type2;
    int op;
    float cina_bez;
    int term;
    float cina_zag;
};

struct MAG tov;
 
char str[9];

FILE *file;
int size = sizeof(struct MAG); 



void delete_num() {
    FILE* file1;
    int n=1, dln, p=1; char dn[3];
    file = fopen("file", "rb"); 
    Tabl_shapka(); 
    while (fread(&tov, size, 1, file)==1) { 
    Radok(n); 
    n++; } 
    Tabl_end(); 
    fclose(file);
    while (p) { 
        cout<<endl<<"Введіть номер рядка: "; 
        cin.clear(); 
        cin.sync(); 
    dln = 0; 
    gets(dn); 
    dn[2]='\0';
    dln = atoi(dn); 
    if(dln<=0 or dln>n-1) cout<<endl<<"Неправильне число"; 
    else p=0; }
    file = fopen("file", "rb"); 
    file1 = fopen("file1", "wb"); 
    n=1; 
    while (fread(&tov, size, 1, file)==1) { 
    if (n!=dln) fwrite(&tov, size, 1, file1); 
    n++; } 
    fclose(file1); 
    fclose(file);
    n=1; 
    remove("file"); 
    rename("file1", "file"); 
    cout<<endl<<"Таблиця після видалення: "<<endl;
    file = fopen("file", "rb"); 
    Tabl_shapka(); 
    while (fread(&tov, size, 1, file)==1) { 
    Radok(n); 
    n++; } 
    Tabl_end(); 
    fclose(file);
    getch();
}

void vidalennya() {
    int z; 
    z = File_isn_pust();
    if (z==1){ cout<<endl<<"Файл не відкрито. Можливо, файлу з таким ім'ям не існує."; 
    getch(); 
    return; 
    } 
    if (z==2){ cout<<endl<<"Файл пустий."; 
    getch(); 
    fclose(file); 
    return; 
    }
    if (z==0) fclose(file); 
    int p=1; 
    char pm;
    while (p) { system("CLS");
    cout<<endl<<"Видалити запис: ";
    cout<<endl<<"1. За номером рядка";
    cout<<endl<<"2. За фірмою ноутбуку";
    cout<<endl<<"3. Головне меню";
    cout<<endl<<"Оберіть: ";
    cin>>pm;
    if (pm=='1' or pm=='2' or pm=='3') {
    switch(pm) {
    case '1': { delete_num(); break; }
    //case '2': { delete_za_keriv(); break; }
    case '3': { p=0;; break; } }
}
    else { cout<<endl<<"Неправильно обрано!"; 
    getch(); }
    }
}

int main() {
    char p_m; 
    do {
        system("CLS");
        SetConsoleCP(1251); 
        SetConsoleOutputCP(1251);
        cout << "Головне меню:";
        cout<<endl<<"1.Додавання даних про поставки товарів"; 
        cout<<endl<<"2.Перегляд усіх поставок";
        cout<<endl<<"3.Наявність ноутбуку у продажу за уведеною операційною системою";
        cout<<endl<<"4.Пошук найдорожчих ноутбуків" ;
        cout<<endl<<"5.Сортування" ;
        cout<<endl<<"6.Видалення";
        cout<<endl<<"7.Вихід з програми" ;
        cout << endl << endl << "Оберіть пункт меню: ";
        cin >> p_m;
        switch (p_m) {
        case'1': {Dodav(); break; }
        case'2': {Usi_tov(); break; }
        case'6': {vidalennya(); break;}
        case'7': {cout << endl << "Кінець роботи"; break; }
        default: {cout << endl << endl << "Обрано невірно!"; 
        getch(); }
        }
    } while (p_m != '7');
    getch();
    return 0;
}

2

Re: Видалення рядка за номером

Що таке File_isn_pust?

3

Re: Видалення рядка за номером

Це функція, яка при відкритті файлу перевіряє його на пустоту

int File_isn_pust() {
    if((file = fopen("file", "rb")) == NULL) {
        return 1;  //якщо відкриття
    }              // бінарного файлу у режимі зчитування
                // не відбулося, то його не існує
        else if (fread(&tov, size, 1, file)==0) //якщо зчитування не відбулося
                 {return 2;                  //то файл існує, але пустий
                 }
           else {rewind(file);//перевести вказівник на файл в початок
                 return 3; // файл не пустий                 
                }
}