Tak jak kaczus powiedział, najlepiej byłoby typowo xmlem to rozwiązać.
Możesz też zrobić to w ten sposób, nie jest to eleganckie ale jak na początek w zupełności powinno wystarczyć.
Przydałaby się również obsługa błędów.
private:
bool read(std::ifstream &file,char *data,size_t size){
if(!file.eof()){
file.read(data,size);
return true;
}
return false;
}
public:
void my_write(std::ofstream &file){
size_t size = tab.size();
file.write(reinterpret_cast<char *>(&size),sizeof(size_t));
for(std::string x : tab){
size_t str_size = x.size();
file.write(reinterpret_cast<char *>(&str_size),sizeof(size_t));
file.write(x.c_str(),x.size());
}
}
bool my_read(std::ifstream &file){
bool ret = false;
size_t size = 0;
ret = read(file,reinterpret_cast<char *>(&size),sizeof(size_t));
for(size_t i=0;i<size;++i){
std::string name;
int str_size = 0;
ret = read(file,reinterpret_cast<char *>(&str_size),sizeof(size_t));
name.resize(str_size);
ret = read(file,&name[0],str_size);
tab.push_back(name);
}
return ret;
}
Można to jeszcze bardziej uprościć odnośnie typów i zapisu.
Tutaj masz kolejno my_write, najpierw zapisujesz wielkość wektora, następnie w pętli wielkość stringa i sam string.
Odczytujesz w drugą stronę, czyli wielkość wektora, potem w petli - wielkość stringa i dane aż do pierwszej wczytanej liczby elementów wektora.
Aby te metody działały z Twoim kodem należy wprowadzić kilka zmian (w kodzie masz wiele niezrozumiałych i śmieciowych rzeczy):
int main()
{
vector <Rodzina> baza;
//bez tych dziwnych linijek
cout << "1.zapisz do pliku" << endl;
...
//zapis
ofstream ofs("./BazaDanych.bin", ios::binary);
for(auto element : baza)
{
element.my_write(ofs);
}
...
//odczyt
while(true)
{
Rodzina obiekt2;
if(!obiekt2.my_read(ifs))
break;
baza.push_back(obiekt2);
}
...
//zapis do obiektu
case 3:
{
for(int i = 0;i<2;++i){
Rodzina obiekt;
obiekt.zapisz();
baza.push_back(obiekt);
cout << "============================================" << endl;
}
...
// wyswietlanie
case 4:
{
for(auto x : baza)
{
x.wyswietl();
cout << "********************************************************"<<endl;
}