将派生 Class 成员写入二进制文件
Writing Derived Class Members to Binary File
我正在开发一个学校管理系统命令行界面应用程序。首先,让我试着解释一下我的程序是如何设计的以及我想要实现什么。
我现在的程序设计:
我有三个 classes 即。 Student
、Teacher
和 Staff
。所有三个 class 都是从 class SchoolMember
公开继承的。 SchoolMember
有数据成员 int id
和 char name[30]
。 Student
、Teacher
和 Staff
有一些额外的数据成员和成员函数。
我有三个不同的函数 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);
}
只有 id
和 name
从 student.dat
文件中删除。 class 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
}
我正在开发一个学校管理系统命令行界面应用程序。首先,让我试着解释一下我的程序是如何设计的以及我想要实现什么。
我现在的程序设计:
我有三个 classes 即。 Student
、Teacher
和 Staff
。所有三个 class 都是从 class SchoolMember
公开继承的。 SchoolMember
有数据成员 int id
和 char name[30]
。 Student
、Teacher
和 Staff
有一些额外的数据成员和成员函数。
我有三个不同的函数 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);
}
只有 id
和 name
从 student.dat
文件中删除。 class 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
}