A telephone directory program, upon request, you can add a new contact, delete a contact, find a contact by phone number, find a contact by name and address, list the entire database. Problems arise only in the function that removes the contact (udalit_kontakt), since after deleting the contact, all fields of the other contacts are filled with arbitrary characters. How can I fix this error? I apologize for the wild mix of C and C ++
#include "stdafx.h" #include<cstring> #include<iostream> #include<cstdio> #include<stdio.h> using namespace std; struct contact { char nomer[12]; char adress[50]; char sname[20]; }; int vivod_bazi() { system("cls"); FILE *f; f = fopen("telbook.dat", "r+b"); fseek(f, 0, SEEK_END); int size = ftell(f); int kol_el = size / sizeof(contact); contact *buf = new contact[kol_el]; fseek(f, 0, SEEK_SET); fread(buf, sizeof(contact), kol_el, f); cout << "Полный список контактов базы данных\n"; cout << "-----------------------------------------------------------\n"; for (int i = 0; i < kol_el; i++) { cout << (i + 1) << ".) " << buf[i].sname; cout << "\n" << buf[i].nomer; cout << "\n" << buf[i].adress; cout << "\n\n"; } cout << "-----------------------------------------------------------\n"; fclose(f); system("pause"); return 0; } int poisk_po_nomeru() { system("cls"); char otvet = 'y'; do{ FILE *f; f = fopen("telbook.dat", "r+b"); fseek(f, 0, SEEK_END); int size = ftell(f); int kol_el = size / sizeof(contact); contact *buf = new contact[kol_el]; fseek(f, 0, SEEK_SET); fread(buf, sizeof(contact), kol_el, f); char poisk_nomer[12]; cout << "Введите номер абонента:"; fflush(stdin); cin >> poisk_nomer; int k = 0; for (int i = 0; ((i < kol_el) && k != -1); i++) { if ((strcmp(poisk_nomer, buf[i].nomer)) == 0) { system("cls"); cout << "Результаты запроса.\n"; cout << "Фамилия:" << buf[i].sname; cout << "\nНомер телефона:" << buf[i].nomer; cout << "\nАдрес:" << buf[i].adress; k = -1; }; } if (k == 0) cout << "\nКонтакт не найден."; cout << "\nПовторить запрос?[y/n]"; fflush(stdin); otvet = getchar(); } while (otvet != 'n'); return 0; } int poisk_po_fam() { system("cls"); char otvet = 'y'; do{ FILE *f; f = fopen("telbook.dat", "r+b"); fseek(f, 0, SEEK_END); int size = ftell(f); int kol_el = size / sizeof(contact); contact *buf = new contact[kol_el]; fseek(f, 0, SEEK_SET); fread(buf, sizeof(contact), kol_el, f); char poisk_sname[20]; char poisk_adress[50]; cout << "Введите фамилию абонента:"; fflush(stdin); cin >> poisk_sname; cout << "Введите адрес абонента:"; fflush(stdin); cin >> poisk_adress; int k = 0; for (int i = 0; ((i < kol_el) && k != -1); i++) { if ((strcmp(poisk_sname, buf[i].sname)) == 0) if ((strcmp(poisk_adress, buf[i].adress)) == 0) { system("cls"); cout << "Результаты запроса.\n"; cout << "Фамилия:" << buf[i].sname; cout << "\nНомер телефона:" << buf[i].nomer; cout << "\nАдрес:" << buf[i].adress; k = -1; }; } if (k == 0) cout << "\nКонтакт не найден."; cout << "\nПовторить запрос?[y/n]"; fflush(stdin); otvet=getchar(); } while (otvet != 'n'); return 0; } int dobavit_kontakt() { system("cls"); contact buf; unsigned int n; char otvet = 'y'; FILE *f; f = fopen("telbook.dat", "ab"); do { cout << "\nВведите фамилию:"; fflush(stdin); cin >> buf.sname; cout << "\nВведите номер телефона"; fflush(stdin); cin >> buf.nomer; cout << "\nВведите адрес абонента:"; fflush(stdin); cin >> buf.adress; fwrite(&buf, sizeof(contact), 1, f); cout << "\nКонтакт добавлен.\nХотите добавить ещё контакт?[y/n]"; fflush(stdin); otvet = getchar(); } while (otvet != 'n'); fclose(f); return 0; } int udalit_kontakt() { system("cls"); char otvet = 'y'; do{ FILE *f; f = fopen("telbook.dat", "r+b"); fseek(f, 0, SEEK_END); int size = ftell(f); int kol_el = size / sizeof(contact); contact *buf = new contact[kol_el]; fseek(f, 0, SEEK_SET); fread(buf, sizeof(contact), kol_el, f); fclose(f); f = fopen("telbook.dat", "w+b"); char udalit_name[12]; cout << "Введите номер контакта,который хотите удалить"; fflush(stdin); cin >> udalit_name; int k = 0; for (int i = 0; ((i < kol_el)&&k!=-1); i++) { if ((strcmp(udalit_name, buf[i].nomer)) == 0) { buf[i] = buf[kol_el-1]; fwrite(&buf, sizeof(contact), (kol_el-1), f); cout << "\nКонтакт успешно удалён!\n"; k = -1; } } if (k == 0) { cout << "\nКонтакт не найден.\n"; fwrite(&buf, sizeof(contact), kol_el, f); } cout << "Хотите удалить другой контакт?[y/n]"; fflush(stdin); otvet = getchar(); system("pause"); fclose(f); } while (otvet != 'n'); return 0; } int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, "RUS"); unsigned int rezh = 0; do{ system("cls"); const int NotUsed = system("color 03"); cout << "Выберите действие:\n"; cout << "1.Узнать адрес и фамилию по телефонному номеру.\n"; cout << "2.Узнать номер телефона по фамилии и адреу.\n"; cout << "3.Добавить новый контакт в базу данных.\n"; cout << "4.Удалить контакт.\n"; cout << "5.Показать всю базу контактов.\n"; cout << "6.Выйти из программы.\n"; cin >> rezh; switch (rezh) { case 1: { poisk_po_nomeru(); break; } case 2: { poisk_po_fam(); break; } case 3: { dobavit_kontakt(); break; } case 4: { udalit_kontakt(); break; } case 5: { vivod_bazi(); break; } } } while (rezh != 6); system("cls"); system("pause"); return 0; }