Необработанное исключение по адресу 0x00007FFEC687F976 в Course_work.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x000001ECDF7E1640

Уже час пытаюсь исправить эту ошибку, при попытки загрузки из специально созданного файла(voters.bin) выдаёт это исключение

#include <iostream>
    #include <fstream>
    #include <string>
    #include<Windows.h>
    
    using namespace std;
    
    struct Voter {
        string fio;
        string address;
        int age;
        int precinct_number;
        int year;
        string vote;
    
        friend ostream& operator<<(ostream& os, const Voter& voter) {
            os << "ФИО: " << voter.fio << endl;
            os << "Адрес: " << voter.address << endl;
            os << "Возраст: " << voter.age << endl;
            os << "Номер участка: " << voter.precinct_number << endl;
            os << "Год голосования: " << voter.year << endl;
            os << "Голос: " << voter.vote << endl;
            return os;
        }
    
        friend istream& operator>>(istream& is, Voter& voter) {
            cout << "Введите ФИО: ";
            getline(is, voter.fio);
            cout << "Введите адрес: ";
            getline(is, voter.address);
            cout << "Введите возраст: ";
            is >> voter.age;
            cout << "Введите номер участка: ";
            is >> voter.precinct_number;
            cout << "Введите год голосования: ";
            is >> voter.year;
            cout << "Введите голос (да / нет / воздерживаюсь): ";
            is >> voter.vote;
            return is;
        }
    };
    
    struct Node {
        Voter data;
        Node* next;
    
        Node(const Voter& voter) : data(voter), next(nullptr) {}
    };
    
    void display_menu() {
        cout << "\n==== Меню ====" << endl;
        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;
        cout << "10. Сохранить список в файл" << endl;
        cout << "11. Загрузить список из файла" << endl;
        cout << "0. Выход" << endl;
    }
    
    void display_all_voters(const Node* head) {
        const Node* current = head;
        while (current) {
            cout << current->data << endl;
            current = current->next;
        }
    }
    
    void add_voter_to_beginning(Node*& head, const Voter& new_voter) {
        Node* new_node = new Node(new_voter);
        new_node->next = head;
        head = new_node;
    }
    
    void add_voter_to_end(Node*& head, const Voter& new_voter) {
        Node* new_node = new Node(new_voter);
        if (!head) {
            head = new_node;
        }
        else {
            Node* current = head;
            while (current->next) {
                current = current->next;
            }
            current->next = new_node;
        }
    }
    
    void add_voter_after(Node*& head, const string& target_fio, const Voter& new_voter) {
        if (!head) {
            cout << "Список избирателей пуст." << endl;
            return;
        }
    
        Node* current = head;
        while (current) {
            if (current->data.fio == target_fio) {
                Node* new_node = new Node(new_voter);
                new_node->next = current->next;
                current->next = new_node;
                return;
            }
            current = current->next;
        }
    
        cout << "Избиратель с указанным ФИО не найден." << endl;
    }
    
    void add_voter_before(Node*& head, const string& target_fio, const Voter& new_voter) {
        if (!head) {
            cout << "Список избирателей пуст." << endl;
            return;
        }
    
        if (head->data.fio == target_fio) {
            Node* new_node = new Node(new_voter);
            new_node->next = head;
            head = new_node;
            return;
        }
    
        Node* prev = head;
        Node* current = head->next;
    
        while (current) {
            if (current->data.fio == target_fio) {
                Node* new_node = new Node(new_voter);
                new_node->next = current;
                prev->next = new_node;
                return;
            }
            prev = current;
            current = current->next;
        }
    
        cout << "Избиратель с указанным ФИО не найден." << endl;
    }
    
    void remove_voter(Node*& head, const string& target_fio) {
        if (!head) {
            cout << "Список избирателей пуст." << endl;
            return;
        }
    
        if (head->data.fio == target_fio) {
            Node* temp = head;
            head = head->next;
            delete temp;
            return;
        }
    
        Node* prev = head;
        Node* current = head->next;
    
        while (current) {
            if (current->data.fio == target_fio) {
                prev->next = current->next;
                delete current;
                return;
            }
            prev = current;
            current = current->next;
        }
    
        cout << "Избиратель с указанным ФИО не найден." << endl;
    }
    
    void display_positive_voters(const Node* head) {
        if (!head) {
            cout << "Список избирателей пуст." << endl;
            return;
        }
    
        int age_group_1 = 0, age_group_2 = 0, age_group_3 = 0;
        cout << "Избиратели, проголосовавшие положительно по возрастным группам:" << endl;
    
        const Node* current = head;
        while (current) {
            if (current->data.vote == "да") {
                if (current->data.age < 30) {
                    age_group_1++;
                }
                else if (current->data.age >= 30 && current->data.age <= 50) {
                    age_group_2++;
                }
                else {
                    age_group_3++;
                }
                cout << current->data << endl;
            }
            current = current->next;
        }
    
        cout << "Количество избирателей младше 30 лет: " << age_group_1 << endl;
        cout << "Количество избирателей от 30 до 50 лет: " << age_group_2 << endl;
        cout << "Количество избирателей старше 50 лет: " << age_group_3 << endl;
    }
    
    void display_negative_voters(const Node* head, int current_year) {
        if (!head) {
            cout << "Список избирателей пуст." << endl;
            return;
        }
            cout << "Избиратели, проголосовавшие отрицательно или воздержавшиеся в текущем году:" << endl;
    
        const Node* current = head;
        while (current) {
            if (current->data.year == current_year && (current->data.vote == "нет" || current->data.vote == "воздерживаюсь")) {
                cout << current->data << endl;
            }
            current = current->next;
        }
    }
    
    void create_precinct_list(const Node* head, int precinct_number) {
        if (!head) {
            cout << "Список избирателей пуст." << endl;
            return;
        }
            cout << "Список избирателей с номером участка " << precinct_number << ":" << endl;
    
        const Node* current = head;
        while (current) {
            if (current->data.precinct_number == precinct_number) {
                cout << current->data << endl;
            }
            current = current->next;
        }
    }
    
    void save_list_to_file(const Node* head, const string& filename) {
        ofstream file(filename, ios::binary);
        if (!file) {
            cerr << "Ошибка открытия файла для записи." << endl;
            return;
        }
            const Node* current = head;
        while (current) {
            file.write(reinterpret_cast<const char*>(&current->data), sizeof(Voter));
            current = current->next;
        }
    
        file.close();
    }
    
    void load_list_from_file(Node*& head, const string& filename) {
        ifstream file(filename, ios::binary);
        if (!file) {
            cerr << "Ошибка открытия файла для чтения." << endl;
            return;
        }
            while (head) {
                Node* temp = head;
                head = head->next;
                delete temp;
            }
        Voter voter;
        while (file.read(reinterpret_cast<char*>(&voter), sizeof(Voter))) {
            add_voter_to_end(head, voter);
        }
    
        file.close();
    }
    
    int main() {
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        Node* head = nullptr; 
        int current_year = 2024; 
            int choice;
        do {
            display_menu();
            cout << "Выберите действие: ";
            cin >> choice;
    
            switch (choice) {
            case 1:
                display_all_voters(head);
                break;
            case 2:
            {
                Voter new_voter;
                cin.ignore();
                cin >> new_voter;
                add_voter_to_beginning(head, new_voter);
            }
            break;
            case 3:
    
            {
                Voter new_voter;
                cin.ignore();
                cin >> new_voter;
                add_voter_to_end(head, new_voter);
            }
            break;
            case 4:
              
            {
                cin.ignore();
                string target_fio;
                cout << "Введите ФИО, после которого нужно добавить избирателя: ";
                getline(cin, target_fio);
                Voter new_voter;
                cin >> new_voter;
                add_voter_after(head, target_fio, new_voter);
            }
            break;
            case 5:
            {
                cin.ignore();
                string target_fio;
                cout << "Введите ФИО, перед которым нужно добавить избирателя: ";
                getline(cin, target_fio);
                Voter new_voter;
                cin >> new_voter;
                add_voter_before(head, target_fio, new_voter);
            }
            break;
            case 6:
            {
                cin.ignore();
                string target_fio;
                cout << "Введите ФИО избирателя, которого нужно удалить: ";
                getline(cin, target_fio);
                remove_voter(head, target_fio);
            }
            break;
            case 7:
                display_positive_voters(head);
                break;
            case 8:
                display_negative_voters(head, current_year);
                break;
            case 9:
            {
                int precinct_number;
                cout << "Введите номер участка: ";
                cin >> precinct_number;
                create_precinct_list(head, precinct_number);
            }
            break;
            case 10:
            {
                string filename;
                cout << "Введите имя файла для сохранения: ";
                cin >> filename;
                save_list_to_file(head, filename);
            }
            break;
            case 11:
            {
                string filename;
                cout << "Введите имя файла для загрузки: ";
                cin >> filename;
                load_list_from_file(head, filename);
            }
            break;
            case 0:
                cout << "Выход из программы." << endl;
                break;
            default:
                cout << "Некорректный выбор. Пожалуйста, выберите действие из меню." << endl;
                break;
            }
        } while (choice != 0);
    
        while (head) {
            Node* temp = head;
            head = head->next;
            delete temp;
        }
    
        return 0;
    }

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