c++objectvectorofstreamwritetofile

C++ Writing a vector of objects to file


I have a vector of objects with quite a few variables (name, type, length etc) which I am trying to write 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();
    }
}

I call the save_records() function with a menu option that ends the application.

The output i get is:

1) If i register a boat object, close the app and go in the text file, I can see the object written twice.

2) If i register 2 objects and I go in the text file, only the last (second) object has been written to file, and it shows 3 times.

Now my questions are:

What causes the double output?

Why is only the last object written to file? I thought the loop would fix that but it didn't


Solution

  • One problem I can spot: "i = 1" in the loop should be "i = 0", because array indexes start from 0. The second: you iterate 'berths' array, so you will get N * N boats saved, if you have N boats in 'berths'.

    The simple solution would be

    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';
         }
    }
    

    If you have to make 'owner_name', 'type' and the rest of the fields as private, then you would have to declare

    void Boat::save(std::ofstream& f) const
    {
        file << owner_name << "; " << boat_name << "; " << type << "; " << length << "; " << draft << '\n';
    }
    

    and modify 'save_all' to

    void save_all()
    {
        ofstream file("records_file.txt");
        for (const Boat& b: berths)
            b.save(f);
    }