вставить функциональные точки в новые данные - PullRequest
0 голосов
/ 18 декабря 2018

Привет, я откровенно новичок в этих форумах, поэтому я пытался искать как можно больше, но не мог найти ничего, что могло бы быть связано с моей проблемой.

Я пытаюсь прочитать узлы, которые я сохранилв файл и вставьте их в связанный список, который я создал

Функции вставки работают отлично, однако при загрузке, когда я пытаюсь вставить узел, 1.it вставляет узел

2.читает новый узел

3. поскольку я использую указатель, указатель теперь указывает на новый узел чтения

4. вставляет вновь прочитанный узел из файла в список, перезаписывая старыйdata.

Это приводит к тому, что мои старые данные полностью теряются, а новый узел выступает в качестве заголовка файла

функция загрузки:

    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 *) test, sizeof (* test));

itтакже перезаписывает старые данные в функции вставки, даже если она вызывается перед этой строкой.

Еще раз вставка в файл работает отлично, я действительно вижу значения, загружаемые через режим отладки, здесьфункция вставки для справки

INSERT:

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();

}

1 Ответ

0 голосов
/ 18 декабря 2018

Здесь исправление для 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...