将派生类成员写入二进制文件
Writing Derived Class Members to Binary File
我正在开发一个学校管理系统命令行界面应用程序。首先,让我试着解释一下我的程序是如何设计的,以及我想要实现的目标。
我现在的程序设计:
我有三个班级,即。Student
,Teacher
和Staff
。所有这三个类都是从类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);
}
仅从student.dat
文件中删除id
和name
。不会删除类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/
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何在 c++ 中使用二进制文件输入/输出读取/写入结构的字符串类型成员
- 将派生类成员写入二进制文件
- 从二进制文件中提取结构体成员