Необработанное исключение по адресу 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*>(¤t->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;
}