管理系统程序-数据读取和保存困难

时间:2019-05-05 11:57:31

标签: c++ file class file-handling

我正在创建一个图书馆管理系统,在该系统中,我需要拥有四种不同类型的用户,

  • 管理员
  • 系统用户
  • 图书管理员
  • 学生

我将Admin类设为基类,并从Admin类继承了所有其他用户。 现在,我的下一个任务是定义类的成员函数及其功能。仅作为示例,以下是我的学生班级的头文件

  class Student:public Admin
{
public:
    Student(); 
    Student(string, string);
    void addStudent();
    void editStudent();
    void deleteStudent();
    void updateStudent();
    void saveStudent();
    void searchStudent();
    void CheckStudentSave();
    void DisplayRecord(); 
    void Set_Student_Id(string);
    void Set_Student_College_Id(string);
    void Set_Student_Name(string);
    void Set_Student_Mobile(string);
    void Set_Student_Email(string);
    void Set_Student_Username(string);
    void Set_Student_Password(string);
    void Set_Student_Address(string); 
private:
    string student_id;
    string student_college_id;
    string student_name;
    string student_mobile;
    string student_email;
    string student_username;
    string student_password;
    string student_address;
};

因此,基本上,此程序将涉及很多文件处理。现在,我已经定义了不同功能的功能,并且为Admin帐户创建了一个功能,管理员可以从中添加新学生并显示现有学生的数据。

通过这种方式,我为Student数据成员创建了2D动态数组,

Admin **student = NULL;
int studentsize = 0 // This will be used to control the size of student
student = new Admin*[1];
student[0] = NULL; 

因此,基本上,studentsize将控制此数组的大小,并且每增加一个Student,它都会添加一个新的Admin指针。然后,该指针将指向一个Student Datatype变量。

我已经在addstudent()函数中获取了Student Class的所有数据成员的输入,然后通过使用saveStudent()函数来保存它们,如下所示,

void Student::saveStudent()
{
    ofstream WriteStudent;
    try
    {
        WriteStudent.open("Student Data.FILE", ios::out | ios::app);
        WriteStudent << student_id << "\n";
        WriteStudent << student_college_id << "\n";
        WriteStudent << student_name << "\n";
        WriteStudent << student_mobile << "\n";
        WriteStudent << student_email << "\n";
        WriteStudent << student_username << "\n";
        WriteStudent << student_password << "\n";
        WriteStudent << student_address << "\n";
        WriteStudent.close();
        cout << "Success! Data has been Saved!\n";
    }
    catch (exception X)
    {
        cout << "File Failed to load. \n";
    }
    cout << "Press Enter to Continue..."; 
    getchar(); 
}

以下是管理员菜单代码

void AdminMenu()
{
    system("cls");
    cout << setw(50) << "****ADMINISTRATION ACCOUNT****"; 
    cout << endl << endl << endl; 
    cout << "1) Add a new Student\n"
        << "2) Display All Students Record\n"
        << "3) Log out\n\n"
        << "Your choice: "; 
    int choice;
    cin >> choice;
    cin.ignore();
    switch (choice)
    {
    case 1:
        student = resizeuser(student, studentsize);
        student[studentsize - 1] = new Student; 
        student[studentsize - 1]->addStudent(); 
        break;
    case 2:
        LoadStudent(); 
        for (int i = 0; i < studentsize-1; i++)
            student[i]->DisplayRecord(); 
        break;
    case 3:
        return; 
    }
    cout << "Press Enter to Continue..."; 
    getchar();
    AdminMenu(); 
}

如您所见,在“情况1”中,我正在调整数组的大小,然后使用已调整大小的数组调用addstudent函数。 SaveStudent函数本身将在addStudent函数中调用。此功能对我来说非常理想。 这是我的调整大小功能,

Admin **resizeuser(Admin **arr, int &size)
{
    Admin **temp = new Admin*[size + 1];
    for (int i = 0; i < size; i++)
        temp[i] = arr[i]; 
    delete[]arr;
    size++;
    return temp; 
}

(请注意,我不能在此使用向量,因为不允许我们使用尚未研究的任何东西)

  • 现在,为了显示该函数,我首先调用LoadStudent函数,该函数将把文件中的所有数据存储到学生的指针中,然后使用它逐个显示记录。 (请注意,loadstudent函数以某种方式为学生提供了比实际大小大一号的大小,这就是为什么我要循环运行直到(i-

这是“加载学生功能”的代码

void LoadStudent()
{
    ifstream LoadStuff;
    LoadStuff.open("Student Data.FILE", ios::in);
    Admin **ptr = new Admin*[1];
    string temp;
    while (1)
    {
        ptr = resizeuser(ptr, studentsize);
        ptr[studentsize - 1] = new Student;
        getline(LoadStuff, temp);
        ptr[studentsize - 1]->Set_Student_Id(temp);
        getline(LoadStuff, temp);
        ptr[studentsize - 1]->Set_Student_College_Id(temp);
        getline(LoadStuff, temp);
        ptr[studentsize - 1]->Set_Student_Name(temp);
        getline(LoadStuff, temp);
        ptr[studentsize - 1]->Set_Student_Mobile(temp);
        getline(LoadStuff, temp);
        ptr[studentsize - 1]->Set_Student_Email(temp);
        getline(LoadStuff, temp);
        ptr[studentsize - 1]->Set_Student_Username(temp);
        getline(LoadStuff, temp);
        ptr[studentsize - 1]->Set_Student_Password(temp);
        getline(LoadStuff, temp);
        ptr[studentsize - 1]->Set_Student_Address(temp);
        if (LoadStuff.eof())
            break;
    }
    student = new Admin*[studentsize];
    for (int i = 0; i < studentsize; i++)
    {
        student[i] = new Student;
        student[i] = ptr[i];
    }
    delete[]ptr;
    LoadStuff.close(); 
}

这显然也很完美。但是我面临一些困难。

  • 如果您添加学生记录,然后关闭程序,然后再次登录到程序中,并要求该程序显示所有记录,则该程序可以正常运行,并且还显示该记录。

但是,如果您添加一个学生记录,然后“不关闭程序”要求它显示记录,则会在第二行显示错误,

for (int i = 0; i < studentsize-1; i++)
    student[i]->DisplayRecord(); // This line causes a RunTime error. 

我不知道为什么会这样,而且我也无法找出问题所在。它在这里中断程序。谁能帮助我,也许可以告诉我我在这里面临的问题?

(注意:如果有人愿意的话,我也可以共享所有Header / CPP文件的所有代码。我没有添加所有代码,因为那样会使一篇文章读起来太长了,实际上它已经拥有了已经成为)

0 个答案:

没有答案