C++ 将对象向量写入文件
C++ Writing a vector of objects to file
我有一个包含相当多变量(名称、类型、长度等)的对象向量,我正在尝试将其写入文件。
vector <Boat> berths;
void Boat::write_boats()
{
ofstream file("records_file.txt");
for (Boat b : berths)
{
file << owner_name << "; " << boat_name << "; " << type << "; " << length << "; " << draft << '\n';
}
file.close();
}
void save_records()
{
for (unsigned int i = 1; i < berths.size(); i++)
{
berths[i].write_boats();
}
}
我使用结束应用程序的菜单选项调用 save_records() 函数。
我得到的输出是:
1) 如果我注册一个船对象,关闭应用程序并进入文本文件,我可以看到对象被写了两次。
2) 如果我注册了 2 个对象并进入文本文件,只有最后一个(第二个)对象被写入文件,并且显示了 3 次。
现在我的问题是:
双输出是什么原因?
为什么只有最后一个对象写入文件?我以为循环会解决这个问题,但它没有
我能发现一个问题:循环中的"i = 1"应该是"i = 0",因为数组索引从0开始。第二个:你迭代'berths'数组,所以你会得到如果您在 'berths'.
中有 N 艘船,则保存 N * N 艘船
简单的解决方案是
void save_all()
{
ofstream file("records_file.txt");
for (Boat b : berths)
{
file << b.owner_name << "; " << b.boat_name << "; " << b.type << "; " << b.length << "; " << b.draft << '\n';
}
}
如果必须将 'owner_name'、'type' 和其余字段设为私有,则必须声明
void Boat::save(std::ofstream& f) const
{
file << owner_name << "; " << boat_name << "; " << type << "; " << length << "; " << draft << '\n';
}
并将'save_all'修改为
void save_all()
{
ofstream file("records_file.txt");
for (const Boat& b: berths)
b.save(f);
}
每次调用ofstream file("records_file.txt");
时,都会创建一个新文件并覆盖它,如果你想在文件中追加,你必须通过这种方式打开它:
ofstream file("records_file.txt", ios::app);
我猜你正在使用 while(!bla.eof()) 之类的东西,如果是这样那么它到达缓冲区的末尾但它需要经过它才能升起标志,所以你有最后两次输出相同的结果。
我有一个包含相当多变量(名称、类型、长度等)的对象向量,我正在尝试将其写入文件。
vector <Boat> berths;
void Boat::write_boats()
{
ofstream file("records_file.txt");
for (Boat b : berths)
{
file << owner_name << "; " << boat_name << "; " << type << "; " << length << "; " << draft << '\n';
}
file.close();
}
void save_records()
{
for (unsigned int i = 1; i < berths.size(); i++)
{
berths[i].write_boats();
}
}
我使用结束应用程序的菜单选项调用 save_records() 函数。
我得到的输出是:
1) 如果我注册一个船对象,关闭应用程序并进入文本文件,我可以看到对象被写了两次。
2) 如果我注册了 2 个对象并进入文本文件,只有最后一个(第二个)对象被写入文件,并且显示了 3 次。
现在我的问题是:
双输出是什么原因?
为什么只有最后一个对象写入文件?我以为循环会解决这个问题,但它没有
我能发现一个问题:循环中的"i = 1"应该是"i = 0",因为数组索引从0开始。第二个:你迭代'berths'数组,所以你会得到如果您在 'berths'.
中有 N 艘船,则保存 N * N 艘船简单的解决方案是
void save_all()
{
ofstream file("records_file.txt");
for (Boat b : berths)
{
file << b.owner_name << "; " << b.boat_name << "; " << b.type << "; " << b.length << "; " << b.draft << '\n';
}
}
如果必须将 'owner_name'、'type' 和其余字段设为私有,则必须声明
void Boat::save(std::ofstream& f) const
{
file << owner_name << "; " << boat_name << "; " << type << "; " << length << "; " << draft << '\n';
}
并将'save_all'修改为
void save_all()
{
ofstream file("records_file.txt");
for (const Boat& b: berths)
b.save(f);
}
每次调用ofstream file("records_file.txt");
时,都会创建一个新文件并覆盖它,如果你想在文件中追加,你必须通过这种方式打开它:
ofstream file("records_file.txt", ios::app);
我猜你正在使用 while(!bla.eof()) 之类的东西,如果是这样那么它到达缓冲区的末尾但它需要经过它才能升起标志,所以你有最后两次输出相同的结果。