Привет, я откровенно новичок на этих форумах, поэтому я попытался найти столько, сколько мог, но я не смог найти ничего, связанного с моей проблемой.
Я пытаюсь прочитать узлы, которые я сохранил в файле, и вставить их в связанный список, который я создал
Функции вставки работают отлично, однако при загрузке, когда я пытаюсь вставить узел, 1. вставляет узел
2. читает новый узел
3. поскольку я использую указатель, указатель теперь указывает на новый узел чтения
4. вставляет вновь прочитанный узел из файла в список, перезаписывая старые данные.
Это приводит к полной потере моих старых данных, и новый узел действует как заголовок файла.
функция загрузки:
void load_file_students(linked_student &students)
{
node_student *test = new node_student;
ifstream stu_list("students.dat",ios::binary);
stu_list.read((char*)test, sizeof(*test));
while (!stu_list.eof())
{
//students.insert_node_list(test);
students.insert_node_list(test);
stu_list.read((char*)test, sizeof(*test));
}
stu_list.close();
}
функция insert_node:
void linked_student::insert_node_list(node_student *student)
{
node_student* temp = new node_student;
temp = student;
if (head == NULL)
{
head = temp;
}
else
{
node_student *ptr = this->head;
while (ptr->next != 0)
{
ptr = ptr->next;
}
temp->previous = ptr;
ptr->next= temp;
}
}
узел:
#pragma once
#include <string>
using namespace std;
static int roll_number = 1; // used for the personal identification of the student
class node_student
{
public:
bool fees_paid = true;
string name;
float CGPA;
int ID; // same as the static roll_number provided
int semester;
string department;
string elective_subjects[5];
node_student *next;
node_student *previous;
node_student();
~node_student();
};
в режиме отладки очевидно, что когда я перечитываю данные в функции загрузки во время
stu_list.read ((char *) тест, sizeof (* тест));
он также перезаписывает старые данные в функции вставки, даже если она вызывается перед этой строкой.
Еще раз, вставка в файл работает отлично, я действительно могу видеть значения, загружаемые в режиме отладки. вот функция вставки для справки
ВСТАВЛЯТЬ :
void update_student_file(linked_student testing)
{
node_student *temp = testing.head;
ofstream stu_list("students.dat",ios::binary);
while (temp != NULL)
{
stu_list.write((char*)temp, sizeof(*temp));
temp = temp->next;
}
stu_list.close();
}
Вы не можете сохранить объект с такими членами std::string. (Ну, вы, очевидно, может, но они бесполезны, когда вы читаете их позже, поскольку они будут недействительными.) Вам нужно прочитать о сериализации.





load_file_students:void load_file_students(linked_student &students)
{
node_student test; //way use dynamic allocation?
ifstream stu_list("students.dat",ios::binary);
while (stu_list.read((char*)test, sizeof(*test)))
{
students.insert_node_list(&test);
}
//file will be closed at the destructor.
}
insert_node_listvoid linked_student::insert_node_list(node_student *student)
{
node_student* temp = new node_student;
*temp = *student; //call copy constructor, do not copy pointer value.
if (head == NULL)
{
head = temp;
}
else
{
node_student *ptr = this->head;
while (ptr->next != 0)
{
ptr = ptr->next;
}
temp->previous = ptr;
ptr->next= temp;
}
}
Пожалуйста, предоставьте минимальный воспроизводимый пример. Кстати, этот
node_student* temp = new node_student; temp = student;- утечка памяти