Возникает ошибка при выведении двух структур из файла C++!
Дано задание: Создать файл с адресами районных отделов внутренних дел (РОВД) и для каждого РОВД указать второй файл, в котором по этому РОВД хранится информация о лицах, имевших правонарушения: фамилия, адрес, код правонарушения, его текстовая формулировка, примененное наказание. Реализовать выдачу справок и учет информации.
Само задание я реализовал следующим образом:
#include<iostream>
#include<fstream> //библиотека для работы с файлами
#include<string> //библиотека для работы со строками
#include<Windows.h> //библиотека для смены кодировки
#define PATH 90
using namespace std; //использование пространство имён std
//прототипы функций----начало
void fr_otd(char *);
void sc_otd(char*);
void th_otd(char*);
void OtdMenu(fstream* f);
//прототипы функций----конец
//шаблон cтруктуры для записи информации о лицах, имевших правонарушения
struct Lico {
string Surname = " "; //фамилия
string address = " "; //адресс
int cod = 0; //код правонарушения
string codExplanation = " "; //текстовая формулировка кода правонарушения
string Punishment = " "; //наказание
void Print()
{
cout << "\n////////////////////////////////////////////////////" <<endl;
cout << "\nФамилия: " << Surname << endl;
cout << "Адрес: " << address << endl;
cout << "Код правонарушения: " << cod << endl;
cout << "Текстовая формулировка кода правонарушения: " << codExplanation << endl;
cout << "Примененное наказание: " << Punishment << endl;
cout << "\n////////////////////////////////////////////////////" << endl;
}
};
int main()
{
setlocale(LC_ALL, "Rus");
char path[PATH] = "MyFile.txt";
char path_for_fr_otd[PATH] = "FirstROVD.txt";
char path_for_sc_otd[PATH] = "SecondROVD.txt";
char path_for_th_otd[PATH] = "ThirdROVD.txt";
ifstream fin;
fin.open(path);
if (!fin.is_open())
{
cout << "Ошибка открытия файла!" << endl;
}
else
{
cout << "Файл " << path << " открыт!\n" << endl;
while (!fin.eof())
{
string finText;
getline(fin, finText);
cout << finText<<endl;
}
fin.close();
cout << "\nВведите номер одного из отделений(1,2,3): " << endl;
int choice;
cin >> choice;
if (choice == 1)
{
fr_otd(path_for_fr_otd);
}
else if (choice == 2)
{
sc_otd(path_for_sc_otd);
}
else if (choice == 3)
{
th_otd(path_for_th_otd);
}
}
return 0;
}
void fr_otd(char* path) //функция для работы с файлом относящимся к 1 отделению
{
cout << "\nВы выбрали 1 отделение!" << endl;
fstream fr;
cout << "Открытие файла с информацией о лицах, имевших правонарушения..." << endl;
fr.open(path, fstream::in | fstream::out | fstream::app);
if (!fr.is_open()) //проверка на открытие файла
{
cout << "Ошибка открытия файла!" << endl;
}
else
{
cout << "Файл "<< path<< " открыт!\n" << endl;
OtdMenu(&fr);
}
fr.close();
}
void sc_otd(char* path) //функция для работы с файлом относящимся ко 2 отделению
{
cout << "\nВы выбрали 2 отделение!" << endl;
fstream sc;
cout << "Открытие файла с информацией о лицах, имевших правонарушения..." << endl;
sc.open(path, fstream::in | fstream::out | fstream::app);
if (!sc.is_open())
{
cout << "Ошибка открытия файла!" << endl;
}
else
{
cout << "Файл " << path << " открыт!\n" << endl;
OtdMenu(&sc);
}
sc.close();
}
void th_otd(char* path) //функция для работы с файлом относящимся к 3 отделению
{
cout << "\nВы выбрали 3 отделение!" << endl;
fstream th;
cout << "Открытие файла с информацией о лицах, имевших правонарушения..." << endl;
th.open(path, fstream::in | fstream::out | fstream::app);
if (!th.is_open())
{
cout << "Ошибка открытия файла!" << endl;
}
else
{
cout << "Файл " << path << " открыт!\n" << endl;
OtdMenu(&th);
}
th.close();
}
void OtdMenu(fstream * f) //функция, которая выполняет действия над файлами(добавляет новых лиц; выводит справку)
{
cout << "\nВведите : " << endl;
cout << "1-Список Лиц, имевшие правонарушения. " << endl;
cout << "2-Занесение нового лица. " << endl;
int choose;
cin >> choose;
if (choose == 1)
{
if (f->peek() == EOF) { cout << "Список пуст!"; }
else
{
Lico spisok;
while (f->read((char*)&spisok, sizeof(spisok)));
{
spisok.Print();
}
}
}
else if (choose == 2)
{
cout << "\nЗанесение нового лица(!!!введите данные не используя пробел!!!): " << endl;
Lico data;
cout << "\nВведите фамилию: ";
SetConsoleCP(1251);
cin >> data.Surname;
SetConsoleCP(866);
cout << "Введите адрес: ";
SetConsoleCP(1251);
cin >> data.address;
SetConsoleCP(866);
cout << "Введите код правонарушения: ";
SetConsoleCP(1251);
cin >> data.cod;
SetConsoleCP(866);
cout << "Введите его текстовую формулировку: ";
SetConsoleCP(1251);
cin >> data.codExplanation;
SetConsoleCP(866);
cout << "Введите примененное наказание: ";
SetConsoleCP(1251);
cin >> data.Punishment;
SetConsoleCP(866);
f->write((char*)&data, sizeof(data));
cout << "\nДанные внесенные в файл... ";
data.Print();
}
}
Проблема: Если в файле правонарушителей больше одного, то после показа последнего инициализированного программа перестаёт работать. Подскажите пожалуйста как можно исправить данную проблему?
PS в файле myFile.txt заранее была записана следующая информация: "Адреса районных отделений внутренних дел (РОВД): 1)Ленинское РУВД-пр.Пушкинский, 24 2)УВД Первомайского района-пр.Кирмаш, 12 3)УВД Партизанксого района-улица Белая, 33".