我们如何从文件中读取并将其存储到 C++ 中的不同对象中?

How do we read from file and store it into different objects in c++?

我正在开发一个项目,将 class 对象存储在动态分配的数组中。 现在我尝试从文本文件中读取对象的值,而不是用户设置对象的值。文件中存储了 10 个对象,我想读取 8 个对象,然后将它们插入到我的动态数组中。这是我的 class:

class Person {
private:
    std::string name;
    double age;

public:
    // Constructor
    Stock(const std::string& name = "", double age = 0)
    {
        this->name = name;
        this->age = age;
    }

    // copy constructor
    Stock(const Stock& s)
    {
        this->name = s.name;
        this->age = s.age;
    }

    // Display function
    void display() const
    {
        std::cout << "Name is " << name << ", "
        << "Age is " << age << ".\n";
    }

    // get functions
    std::string getName() const
    {
        return name;
    }
    double getAge() const
    {
        return age;
    }

我的文本文件如下所示:

Tony
25
Cap 
30
Loki & Sylvi
20
...

如何将这些行读入 8 个单独的对象?

您似乎没有真正编译提供的代码,因为它存在问题。

serialize/deserialize 数据有不同的方法。这是一种方法,可能足以满足您的需求。

此代码允许从 istream& 构造 Person。另一种提供静态 class 工厂函数 以从 istream& 构造 Person 的方法,这可能更常见。

构造后,Person可以添加到vector,这是C++中的动态数组。

#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::getline;
using std::istream;
using std::istringstream;
using std::move;
using std::ostream;
using std::runtime_error;
using std::string;
using std::vector;

namespace {

char const* data =
R"(Tony
25
Cap 
30
Loki & Sylvi
20
Bob 1
20
Bob 2
30
Bob 3
40
Bob 4
50
Bob 5
60
Bob 6
70
Bob 7
80
)";

auto get_string(istream& in) -> string {
    string result;
    if (getline(in, result)) return result;
    throw runtime_error("get_string");
}

auto get_double(istream& in) -> double {
    string line;
    if (!getline(in, line))
        throw runtime_error("get_double");

    istringstream ss(line);
    double result;
    if (!(ss >> result))
        throw runtime_error("get_double");

    return result;
}

class Person final {
    string _name;
    double _age;

public:
    Person(string name_ = "", double age_ = 0) : _name{move(name_)}, _age{age_} { }
    Person(Person const& s) : _name{s._name}, _age{s._age} { }
    Person(istream& in) : _name{get_string(in)}, _age{get_double(in)} { }

    void print(ostream& out) const {
        out << "Name is " << _name << ", " << "Age is " << _age << ".";
    }

    auto name() const -> string { return _name; }
    auto age() const -> double { return _age; }
};

auto operator<<(ostream& out, Person const& p) -> ostream& {
    p.print(out);
    return out;
}

auto operator<<(ostream& out, vector<Person> const& v) -> ostream& {
    for (auto&& p : v) {
        out << p << "\n";
    }
    return out;
}

} // anon

int main() {
    istringstream ss(data);
    auto tony = Person(ss);
    auto cap = Person(ss);
    auto loki_sylvi = Person(ss);
    cout << tony << "\n";
    cout << cap << "\n";
    cout << loki_sylvi << "\n";

    vector<Person> peeps;
    peeps.emplace_back(ss);
    peeps.emplace_back(ss);
    peeps.emplace_back(ss);
    cout << peeps << "\n";
}

如果我需要将对象保存到文件,我会将原始对象写入文件:

std::ofstream file("ofile.txt", std::ios::binary, std::ios::trunc);
file.write(&myPerson, (&myPerson)[1]);

然后读取文件并将其转换为 Person class。