修改后的LinkedList不会在文本文件本身中更新

时间:2018-10-26 16:50:15

标签: c++ data-structures singly-linked-list

简介: 我正在研究Project @Student Course Registration System, 我的项目基于单链列表,并具有文件处理功能。

问题: 我设法修改了LinkedList中的节点,并做了一个单独的功能来更新我的文本文件。但是问题是文件没有更新。在控制台上,我确实看到了更新的项目。

我必须解决不修改临时文本文件并将其复制到该文本文件的问题,我知道该怎么做。

P.S:我已经创建了一个函数,该函数始终在启动时将所有必需的文本文件加载到程序中。

结构:

struct Student {
    string stdID;
    string stdName;
    string stdSemester;
    Student  *next;
};

主要

int main() {
    Student *Head = NULL;
    Student *Tail = NULL;
    Course *Headd = NULL;
    Course *Taill = NULL;

    UpdateDirectory(Head, Tail, Headd, Taill);
    Display(Head, Tail);
    _getch();
    string Value;
    getline(cin, Value);
    ModifyStudent(Value, Head);
    UpdateFile(Head, Tail);
    //Display(Head, Tail);
    return 0;
}

修改功能:

void ModifyStudent(string Value, Student *&Head) {
    // Initialize:
    Student *Curr = NULL;
    Student *Temp1 = NULL;
    Student *Temp2 = NULL;
    Student *Obj = new Student;

    if (isEmpty(Head)) {
        cout << "\t\t\t\t       Underflow....\n\n";
        _getch();
    }
    else {
        Curr = Head;
        Temp1 = Head;
        while (Curr->stdID != Value) {
            Temp1 = Curr;
            Curr = Curr->next;
            }

        if (Curr->stdID == Value) {
            cout << "\t\t\t\t       Student  Found!!\n\n";
            cout << Curr->stdID << endl; // 1324
            cout << Temp1->stdID << endl; // 3424

            // Modify:
            cout << "\t\t\t\t       Enter New Student ID  :  ";
            getline(cin, Obj->stdID);
            cout << "\t\t\t\t       Enter New Student Name  :  ";
            getline(cin, Obj->stdName);
            cout << "\t\t\t\t       Enter New Semester  :  ";
            getline(cin, Obj->stdSemester);

            Temp1->next = Obj;
            Obj->next = Curr->next;
            Curr->next = NULL;
            delete(Curr);

            /// Save:
            cout << "\t\t\t\t       Record Is Being Updated, Please Wait.......\n\n" << endl;
            _getch();
            }
        }
}

更新文件:

void UpdateFile(Student *&Head, Student *&Tail) {
    Student *Temp = NULL;
    fstream SFile;
    SFile.open("StudentRecords.txt", ios::trunc);

    if (isEmpty(Head)) {
        cout << "\t\t\t\t       UnderFlow\n" << endl;
    }
    else {
        Temp = Head;
        while (Temp->next != NULL) {
            cout << Temp->stdID << '\t' << Temp->stdName << '\t' << Temp->stdSemester << '\n';
            SFile << Temp->stdID << '\t' << Temp->stdName << '\t' << Temp->stdSemester << '\n';
            Temp = Temp->next;
        }
        cout << Temp->stdID << '\t' << Temp->stdName << '\t' << Temp->stdSemester << '\n';
        SFile << Temp->stdID << '\t' << Temp->stdName << '\t' << Temp->stdSemester << '\n';
        _getch();;
    }
    _getch();;
}

我什至使用过ios :: trunc,但没有效果。 谢谢!

1 个答案:

答案 0 :(得分:1)

很难说是什么问题。您没有提供完整的源代码。因此我们无法编译代码。

要写入文件,请使用以下命令。该文件将被覆盖(这似乎是您要查找的内容):

ofstream os{ "test.txt" };
if( !os )
  return -1;
if( !list.write( os ) )
  return -2;

关于您的代码,这是一种更像c ++的方法来处理单个链表:

  • 定义数据类/结构。您可能希望将数据与其他类一起使用,而不只是与链表一起使用,因此请将其与节点分开:

    class student_t
    {
    public:
      string id;
      string name;
      string semester;
      // ...
    };
    
  • 定义操作。您需要执行的一项操作是

      ostream& write( ostream& os )
      {
        return os
          << id << endl
          << name << endl
          << semester << endl;
      }
    
  • 定义一个节点。节点由数据和指向下一个节点的指针组成:

    class node_t
    {
      friend class list_t; // or replace it with public:
    
      student_t data;
      node_t* pnext;
      // ...
    };
    
  • 添加构造函数 write 方法:

      node_t( const student_t& s, node_t* pnext ) : data{ s }, pnext{ pnext } {}
    
      ostream& write_data( ostream& os )
      {
        return data.write( os );
      }
    
  • 定义列表类。列表类别包含的唯一数据是列表的标题。该类将收集所有列表操作,例如write_datapush_frontdisplay_data等。

    class list_t
    {
      node_t* phead{ nullptr };
    
    public:
    
      void push_front( const char* id, const char* name, const char* semester )
      {
        phead = new node_t( student_t{ id, name, semester }, phead );
      }
    
      ostream& write( ostream& os )
      {
        node_t* pn = phead;
        while( pn && pn->write_data( os ) )
          pn = pn->pnext;
        return os;
      }
      //...
    };
    

这是您的使用方式:

    int main()
    {
      list_t list;
      list.push_front( "J1", "Jon", "first" );
      list.push_front( "S1", "Steve", "first" );

      {
        ofstream os{ "test.txt" };
        if( !os )
          return -1;
        if( !list.write( os ) )
          return -2;
      } // the file is automatically closed here

      list.push_front( "A1", "Ava", "second" );

      {
        ofstream os{ "test.txt" };
        if( !os )
          return -1;
        if( !list.write( os ) )
          return -2;
      }

      return 0;
    }