我们如何从文件中读取并将其存储到 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。
我正在开发一个项目,将 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。