Нужна помощь в отладке работы меню ввода и вывода
Это программа "Телефонная книга " Проблема : при выборе пункта меню он сразу же завершается и не дает возможности вносить данные. Пока не могу понять в чем проблема. (прошу не сильно ругать я только учусь.)
#include <iostream>
#include <windows.h>
#include <string.h>
#include <conio.h>
#include <iomanip>
using namespace std;
const HANDLE CONSOLE = GetStdHandle(STD_OUTPUT_HANDLE);
// глобальная переменная для подсчета количества записей в записной книжке
int NOTE_COUNTER = 0;
const int VERB = 20;
const int PHONE_LENGTH = 12;
// структура, описывающая данные записи
struct Note_ {
char name[VERB];
char surname[VERB];
char nubmer[PHONE_LENGTH];
char icq[VERB];
};
// вывод всех записей книжки
void print(Note_*& notebook) {
for (int i = 0; i < NOTE_COUNTER; i++) {
cout << "Note # " << i << ":" << endl;
cout << notebook[i].name << " " << notebook[i].surname << endl
<< "Phone number: " << notebook[i].nubmer << endl
<< "ICQ number: " << notebook[i].icq << endl << endl;
}
cout << endl;
}
// вывод записи из книжки по индексу
void print(Note_*& notebook, int index) {
cout << "Note # " << index << ":" << endl;
cout << notebook[index].name << " " << notebook[index].surname << endl
<< "Phone number: " << notebook[index].nubmer << endl
<< "ICQ number: " << notebook[index].icq << endl;
cout << endl;
}
// добавление новой записи
Note_* add(Note_*& notebook) {
// переменная типа Note_, которая содержит новые сведения. Позже она будет добавлена в новую книжку
Note_ New_note;
// ниже описан ввод данных новой записи
cout << "Type name: ";
cin.get(New_note.name, VERB);
cin.ignore(255, '\n');
cout << "Type surname: ";
cin.get(New_note.surname, VERB);
cin.ignore(255, '\n');
cout << "Type phone number: ";
cin.get(New_note.nubmer, PHONE_LENGTH);
cin.ignore(255, '\n');
cout << "Type ICQ number: ";
cin.get(New_note.icq, VERB);
cin.ignore(255, '\n');
// инкримент счетчика записей, т.к. добавляем новую запись
NOTE_COUNTER++;
// новая книжка увеличенного размера
Note_* Updated_notebook = new Note_[NOTE_COUNTER];
// переписывание всех записей из старой книжки в новую
if (NOTE_COUNTER > 1) {
for (int i = 0; i < NOTE_COUNTER - 1; i++)
Updated_notebook[i] = notebook[i];
}
// запись в книжку новой книжки
Updated_notebook[NOTE_COUNTER - 1] = New_note;
//удаление старой книжки
delete[] notebook;
// возврат новой книжки заместо старой
return Updated_notebook;
}
// удаление записи по индексу
Note_* remove_(Note_*& database, int index) {
// вывод удаляемой записи
cout << "You have chosen to delete this note:" << endl;
print(database, index);
// затирание нужной записи путем записи поверх остальных записей (тафталогия :))
for (int i = index; i < NOTE_COUNTER - 1; i++)
database[i] = database[i + 1];
// декримент количества записей т.к. количество записей уменьшилось
NOTE_COUNTER--;
// новая книжка уменьшенного размера
Note_* Updated_database = new Note_[NOTE_COUNTER];
// копирование в новую книжку всех записей
for (int i = 0; i < NOTE_COUNTER; i++)
Updated_database[i] = database[i];
// удаление старой
delete[] database;
// возврат обновленной книжки
return Updated_database;
}
// поиск по фамилии
void find_surname(Note_*& notebook, char* surname) {
for (int i = 0; i < NOTE_COUNTER; i++)
if (!strcmp(notebook[i].surname, surname)) print(notebook, i);
}
// поиск по первой букве фамилии
void find_surname(Note_*& notebook, char letter) {
for (int i = 0; i < NOTE_COUNTER; i++)
if (letter == notebook[i].surname[0]) print(notebook, i);
}
// поиск по номеру
void find_number(Note_*& notebook, char* number) {
for (int i = 0; i < NOTE_COUNTER; i++)
if (!strcmp(notebook[i].nubmer, number)) print(notebook, i);
}
// поиск по номеру icq
void find_number_icq(Note_*& notebook, char* icq) {
for (int i = 0; i < NOTE_COUNTER; i++)
if (!strcmp(notebook[i].icq, icq)) print(notebook, i);
}
// редактирование записи
void edit(Note_*& notebook, int index) {
cout << "Information: " << endl;
print(notebook, index);
// переменная типа Note_, которая содержит новые сведения. Позже она будет добавлена в новую книжку
Note_ New_note;
// ниже описан ввод новых данных пользователя
cout << "Type name: ";
cin.get(New_note.name, VERB);
cin.ignore(255, '\n');
strcpy_s(notebook[index].name, New_note.name);
cout << "Type surname: ";
cin.get(New_note.surname, VERB);
cin.ignore(255, '\n');
strcpy_s(notebook[index].surname, New_note.surname);
cout << "Type phone number: ";
cin.get(New_note.nubmer, PHONE_LENGTH);
cin.ignore(255, '\n');
strcpy_s(notebook[index].nubmer, New_note.nubmer);
cout << "Type ICQ: ";
cin.get(New_note.icq, VERB);
cin.ignore(255, '\n');
strcpy_s(notebook[index].icq, New_note.icq);
cout << endl << endl;
cout << "Updated information: " << endl;
print(notebook, index);
}
// загрузка файла
Note_* notebook_download(Note_*& notebook, FILE*& nb_file, char* nb_name) {
int UPDATED_NOTEBOOK_COUNTER = 0;
fopen_s(&nb_file, nb_name, "rb");
// подсчет количества записей в книжку
Note_ worker;
while (true) {
fread_s(&worker, sizeof(worker), sizeof(worker), 1, nb_file);
if (!feof(nb_file)) UPDATED_NOTEBOOK_COUNTER++;
else break;
}
// новый массив, куда запишем книжку
Note_* updated_notebook = new Note_[UPDATED_NOTEBOOK_COUNTER];
// устанавливаем курсор на начало файла
fseek(nb_file, 0, SEEK_SET);
for (int i = 0; i < UPDATED_NOTEBOOK_COUNTER; i++) {
fread_s(&updated_notebook[i].name, VERB, VERB, 1, nb_file);
fread_s(&updated_notebook[i].surname, VERB, VERB, 1, nb_file);
fread_s(&updated_notebook[i].nubmer, PHONE_LENGTH, PHONE_LENGTH, 1, nb_file);
fread_s(&updated_notebook[i].icq, VERB, VERB, 1, nb_file);
}
fclose(nb_file);
// удаление старой книжки
delete[] notebook;
// обновление размера книжки
NOTE_COUNTER = UPDATED_NOTEBOOK_COUNTER;
// возврат обновленной книжки
return updated_notebook;
}
// выгрузка новой версии книжки в файл
void notebook_upload(Note_*& notebook, FILE*& nb_file, char* nb_name) {
fopen_s(&nb_file, nb_name, "wb");
for (int i = 0; i < NOTE_COUNTER; i++) {
fwrite(notebook[i].name, VERB, 1, nb_file);
fwrite(notebook[i].surname, VERB, 1, nb_file);
fwrite(notebook[i].nubmer, PHONE_LENGTH, 1, nb_file);
fwrite(notebook[i].icq, VERB, 1, nb_file);
}
fclose(nb_file);
}
// вывод меню
int main() {
setlocale(LC_ALL, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Note_* notebook = new Note_[NOTE_COUNTER]; // массив записей
FILE* nb_file; // создание переменной для работы с файлом
char db_name[VERB]{ "notebook" };
int num = 0;
cout << "1." << endl;
cout << "2." << endl;
cout << "3." << endl;
cout << "4." << endl;
cout << "5." << endl;
cout << "6." << endl;
cout << "7." << endl;
cout << "8." << endl;
cout << "9." << endl;
cin >> num;
switch (num)
{
case 0: { // вывод всех записей
print(notebook);
}
break;
case 1: { // поиск по фамилии
cout << "Print surmane to search: ";
char surname[VERB];
cin.get(surname, VERB);
cin.ignore(255, '\n');
find_surname(notebook, surname);
}
break;
case 2: { // поиск по первой букве фамилии
cout << "Print capital letter of surname to search: ";
char letter;
cin >> letter;
cin.ignore(255, '\n');
find_surname(notebook, letter);
}
break;
case 3: { // поиск по номеру телефона
cout << "Print number to search: ";
char number[PHONE_LENGTH];
cin.get(number, PHONE_LENGTH);
cin.ignore(255, '\n');
find_number(notebook, number);
} break;
case 4: { // поиск по номеру icq
cout << "Print ICQ number to search: ";
char icq[VERB];
cin.get(icq, VERB);
cin.ignore(255, '\n');
find_number_icq(notebook, icq);
}
break;
case 5: { // добавление новой записи
notebook = add(notebook);
cout << endl << endl << "New note: " << endl;
print(notebook, NOTE_COUNTER - 1);
}
break;
case 6: { // редактирование записи по индексу
print(notebook);
cout << "Print index of note to edit: ";
int index;
cin >> index;
cin.ignore(255, '\n');
edit(notebook, index);
}
break;
case 7: { // удаление записи по индексу
print(notebook);
cout << "Print index of note to remove: ";
int index;
cin >> index;
cin.ignore(255, '\n');
notebook = remove_(notebook, index);
cout << "Note was succesfully deleted!" << endl;
}
break;
case 8: { // выгрузка книжки в файл
cout << "Updating notebook to file \"" << db_name << "\"..." << endl;
notebook_upload(notebook, nb_file, db_name);
cout << "Updating complete!" << endl;
}
break;
case 9: { // выход из программы
cout << "Updating notebook to file \"" << db_name << "\"..." << endl;
notebook_upload(notebook, nb_file, db_name);
cout << "Updating complete!" << endl;
cout << "Exiting..." << endl;
}
break;
}
system("pause");
system("cls");
}