C ++ Запись вектора объектов в файл - PullRequest
0 голосов
/ 09 мая 2020

У меня есть вектор объектов с довольно большим количеством переменных (имя, тип, длина и т. Д. c), которые я пытаюсь записать в файл.

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) Если я зарегистрирую объект лодки, закрою приложение и go в текстовом файле, я могу см. объект, записанный дважды.

2) Если я регистрирую 2 объекта и I go в текстовом файле, в файл был записан только последний (второй) объект, и он отображается 3 раза.

Теперь мои вопросы:

Что вызывает двойной вывод?

Почему в файл записывается только последний объект? Я думал, что l oop исправит это, но не

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Каждый раз, когда вызывается ofstream file("records_file.txt");, он создает новый файл и перезаписывает его, если вы хотите добавить в файл, вы должны открыть его следующим образом:

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

См .: http://www.cplusplus.com/doc/tutorial/files/

1 голос
/ 09 мая 2020

Одна проблема, которую я могу заметить: "i = 1" в l oop должно быть "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);
}
...