C++向文件中写入对象的向量

问题描述 投票:0回答:1

我有一个对象的向量,有很多变量(名称、类型、长度等),我想把它们写入文件。

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次。

现在我的问题是。

是什么原因导致双重输出?

为什么只有最后一个对象被写入文件?我以为循环可以解决这个问题,但是没有。

c++ object vector ofstream writetofile
1个回答
1
投票

我发现了一个问题:在循环中的 "i = 1 "应该是 "i = 0",因为数组索引从0开始。循环中的 "i = 1 "应该是 "i = 0",因为数组的索引是从0开始的。 第二个问题: 你迭代 "泊位 "数组,所以你会得到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);
}

1
投票

每次 ofstream file("records_file.txt"); 调用,它创建了一个新的文件并覆盖了它,如果你想在文件中添加,你必须通过这种方式打开它。

ofstream file("records_file.txt", ios::app); 

请看: http:/www.cplusplus.comdoctutorialfiles

© www.soinside.com 2019 - 2024. All rights reserved.