Возникает ошибка при выведении двух структур из файла 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".


Ответы (0 шт):