您好,我是这些论坛的新手,所以我尝试了尽可能多的查找,但找不到与我的问题有关的任何内容。
我试图读取存储在文件中的节点,并将其插入到我创建的链接列表中
insert函数工作得很好,但是当我尝试插入节点时,在加载它时, 1.插入节点
2。读取新节点
3。因为im使用了指针,所以指针现在指向新的读取节点
4。将文件中新读取的节点插入到列表中,以覆盖旧数据。
这导致我的旧数据完全丢失,而新节点充当文件头
加载功能:
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;
}
}
insert_node函数:
#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();
};
节点:
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();
}
在调试模式下,很明显,当我重新读取加载函数中的数据时
stu_list.read((char *)test,sizeof(* test));
即使在此行之前被调用,它也会覆盖insert函数中的旧数据。
再一次插入文件就可以了,我实际上可以看到通过调试模式加载的值 这是供参考的插入功能
插入:
normalize-space(td[4]="Available")
答案 0 :(得分:1)
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_list
的另一种解决方法void 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;
}
}