将功能点插入新数据

时间:2018-12-18 11:20:28

标签: c++ visual-c++

您好,我是这些论坛的新手,所以我尝试了尽可能多的查找,但找不到与我的问题有关的任何内容。

我试图读取存储在文件中的节点,并将其插入到我创建的链接列表中

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")

1 个答案:

答案 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;
    }
}