[英]Writing vector of objects to file
如何写一个包含多个指向文件的char指针的对象并回读?
class Student {
public:
char* name;
char* age;
int size;
Student(char* _name, char* _age) {
name = _name;
age = _age;
size = 0;
size = strlen(_name) + strlen(_age);
}
};
我有一个向量学生对象数组( vector<Student*>
)。 如何将此向量写入文件然后再读回?
有人可以帮忙吗? 如果没有boost::serialization
的帮助,我们可以做到这一点吗?
首先,首选std::string
不是char*
。 您再也不需要大小了。 与在构造函数主体中分配值相比,更喜欢构造函数中的初始化:
class Student {
public:
std::string name;
std::string age;
Student(const std::string& _name, const std::string& _age) :
name{_name}, age{_age}
{};
auto size() const -> size_t {
return name.size() + age.size();
};
};
回到您的问题。 在尝试存储复杂的结构之前,必须定义格式。 在这种情况下,我选择了带有分号作为字段分隔符且不带引号的简单CSV。
void writeStudents(std::ostream& o, const std::vector<Student*>& students) {
for(auto s: students) {
o << s->name << ';' << s->age << '\n';
}
}
void writeStudents(std::ostream&& o, const std::vector<Student*>& students) {
writeStudents(o, students);
}
现在您可以使用`std :: ofstream``来生成该csv:
writeStudents(std::ofstream{"myFilename"}, students);
要读回它,您必须解析之前定义的格式:
auto readStudents(std::istream& i) -> std::vector<Student*> {
auto students = std::vector<Student*>;
auto line = std::string{};
while( std::getline(i, line) ) {
auto pos = line.find_first_of(';');
students.push_back(new Student{std::string{line, 0, pos},
std::string{line, pos+1}});
}
return students;
}
auto readStudents(std::istream&& i) -> std::vector<Student*> {
return readStudents(i);
}
现在,您可以使用std::ifstream
读取文件:
auto students = readStudents(std::ifstream{"myFilename"});
注意:此答案中的所有代码均未经测试。 当然要提防错误。 我也将错误处理留给您,因为我不想用那种噪音污染答案。
顺便说一句:您如何确保对学生的记忆进行了正确的管理? 考虑使用std::unique_ptr<>
或std::shared_ptr<>
代替原始指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.