将派生类成员写入二进制文件

Writing Derived Class Members to Binary File

本文关键字:二进制文件 成员 派生      更新时间:2023-10-16

我正在开发一个学校管理系统命令行界面应用程序。首先,让我试着解释一下我的程序是如何设计的,以及我想要实现的目标。

我现在的程序设计:
我有三个班级,即。StudentTeacherStaff。所有这三个类都是从类SchoolMember公开继承的。SchoolMember有数据成员int idchar name[30]StudentTeacherStaff有一些额外的数据成员和成员函数。

我有三个不同的功能removeStudent()removeTeacher()removeStaff()分别从二进制文件中删除学生,教师和工作人员的内容。
以下是removeTeacher()的外观:

void removeTeacher()
{
Teacher teacherRead;
int inputTeacherId; 
short flag = 0;
ifstream fileToRead("data/teacher.dat", ios::binary);
ofstream fileToWrite("data/temp_teacher.dat", ios::binary | ios::app);
cout << "Enter ID of teacher whose data has to be removed: ";
cin >> inputTeacherId;
while (fileToRead.read((char *)&teacherRead, sizeof(teacherRead)))
{
if (inputTeacherId == teacherRead.getId())
flag++;
else
fileToWrite.write((char *)&teacherRead, sizeof(teacherRead));
}
if (flag == 0)
cout << "Sorry, No Match found.";
else
cout << "Data of teacher " << inputTeacherId << " has been removed from file.";
fileToRead.close();
fileToWrite.close();
remove("data/teacher.dat");
rename("data/temp_teacher.dat", "data/teacher.dat");
}

removeStudent()removeStaff()功能完全相同!唯一的区别是在对象上,即使用removeStudent()Student studentRead和使用removeTeacher()Teacher teacherRead,而且文件路径也不同。

我想实现的是:
因为三个功能的功能是相同的。我想用一个函数替换它。因此,我搜索了互联网并阅读了一些继承和OOP概念。然后我实现了一个函数:

void removeMember(string filePath, string tempFilePath, SchoolMember member)
{
int inputId = 0; 
short flag = 0;
ifstream fileToRead(filePath.c_str(), ios::binary);
ofstream fileToWrite(tempFilePath.c_str(), ios::binary | ios::app);
cout << "Enter ID whose data has to be removed: "; 
cin >> inputId;
while (fileToRead.read((char *)&member, sizeof(member)))
{
if (inputId == member.getId())
++flag;
else
fileToWrite.write((char *)&member, sizeof(member));
}
if (flag == 0)
cout << "Sorry, No Match found.";
else
cout << "Data of ID " << inputId << " has been removed from file.";
fileToRead.close();
fileToWrite.close();
remove(filePath.c_str());
rename(tempFilePath.c_str(), filePath.c_str());
}

现在,当我调用上述函数时:

void removeDataScreen()
{
Student schoolStudent; // Object
removeMember("data/student.dat", "data/temp_student.dat", schoolStudent);
}

仅从student.dat文件中删除idname。不会删除类Student的所有数据成员。我想删除Student的所有数据成员。如何做到这一点?

我希望我足够详细地解释了这个问题。我将寻找解决方案:)

完整的源代码可以在以下位置找到: https://github.com/vkWeb/school-management-system/blob/master/main.cpp

对于这个特定问题,模板函数非常适合:

template <class T>
void removeMember(string filePath, string tempFilePath) {
T MemberObject;
// Rest of your code
}

请参阅:http://www.cplusplus.com/doc/oldtutorial/templates/