将对象向量写入文件
Writing vector of objects to file
如何将包含多个字符指针的对象写入文件并读回?
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);
}
};
我有一个 Student 对象的向量数组 (vector<Student*>
)。如何将此向量写入文件然后读回?
有人可以帮忙吗?我们可以在没有 boost::serialization
帮助的情况下做到这一点吗?
首先比char*
更喜欢std::string
。你不再需要尺寸了。也更喜欢在构造函数中初始化而不是在构造函数主体中赋值:
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<>
而不是原始指针。
如何将包含多个字符指针的对象写入文件并读回?
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);
}
};
我有一个 Student 对象的向量数组 (vector<Student*>
)。如何将此向量写入文件然后读回?
有人可以帮忙吗?我们可以在没有 boost::serialization
帮助的情况下做到这一点吗?
首先比char*
更喜欢std::string
。你不再需要尺寸了。也更喜欢在构造函数中初始化而不是在构造函数主体中赋值:
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<>
而不是原始指针。