【问题标题】:C++ Writing a vector of objects to fileC ++将对象向量写入文件
【发布时间】:2023-03-06 18:56:01
【问题描述】:

我有一个包含很多变量(名称、类型、长度等)的对象向量,我正在尝试将这些变量写入文件。

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】:

    我可以发现一个问题:循环中的“i = 1”应该是“i = 0”,因为数组索引从 0 开始。第二个问题:你迭代 '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);
    }
    

    【讨论】:

    • i=1 是故意的,因为我正在存储以 1 开头的船(原因与问题无关)无论如何,我尝试按照您的建议进行操作,并且现在输出一些乱码 (; ; ; -858993460; -858993460) 然后是对象...
    • 好的,我再次尝试了 const 和所有内容,现在它至少保存了每个不同的对象,但第一个输出仍然是我所说的胡言乱语。我意识到这实际上可能与我没有使用的 0 索引有关,现在我想到了哈哈。我会看看我能不能摆脱它:) 谢谢你的帮助
    • 很高兴这一切都有帮助。
    【解决方案2】:

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

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

    见:http://www.cplusplus.com/doc/tutorial/files/

    【讨论】:

    • 谢谢,我把它移到了 save_records() 函数,它只在关闭应用程序之前调用一次:)
    【解决方案3】:

    我猜你正在使用类似 while(!bla.eof()) 的东西,如果是这样,那么它会到达缓冲区的末尾,但它需要越过它才能提高标志,所以你有两次相同的输出结束。

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 2019-10-27
      • 2020-12-17
      • 2013-03-26
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2012-07-28
      • 2014-04-21
      相关资源
      最近更新 更多