c++ - 将对象 vector 写入文件

标签 c++ file vector stl fwrite

如何将包含多个字符指针的对象写入文件并读回?

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 数组 ( vector<Student*> )。如何将此 vector 写入文件然后读回?

有人可以帮忙吗?我们可以在没有 boost::serialization 帮助的情况下做到这一点吗? ?

最佳答案

首先喜欢std::stringchar* .你不再需要尺寸了。也更喜欢在构造函数中初始化而不是在构造函数主体中赋值:

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<>而不是原始指针。

关于c++ - 将对象 vector 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34174169/

相关文章:

c++ - 在包含 Eigen 类型的类上使用 ` Eigen::aligned_allocator` on `std::vector`

c++ - 即使我在着色器中使用了变量,glGetUniformLocation也会返回-1

C++:如果 protected ,为什么在派生类内部无法访问基对象

c++ - C++ 新手, "EXC_BAD_ACCESS"错误我不明白

vector - 在 clojure 中替换向量中第 n 个元素的简单方法?

c++ - 按偶数和奇数索引对 vector 进行排序。 C++

c++ - 在 dlib 图像中写入文本

security - 授权访问外部托管文件

python - 如何将 python 中 for 循环的输出写入 csv 格式的文件?

python - 将文本写入 gzip 文件