Zapis i odczyt tablicy obiektów z pliku

0

Witam wszystkich! Jestem początkującym programistą c++. Mam taki o to problem: zupełnie nie mam pojęcia jak zapisać do pliku tablicę (jednowymiarową) której zawartością są obiekty mojej własnej klasy.

Próbowałem za pomocą plików binarnych, jednak plik po zapisie ma 0b, a odczyt krzaczy mi się jeszcze w kompilatorze.

Czy robił ktoś coś podobnego i wie jak się do tego zabrać? Najlepiej byłoby gdyby program przerzucił mi wprost zawartość pliku do tablicy i odwrotnie, zawartość tablicy wrzucił wprost do pliku... Chcę zrobić odczyt niedługo po włączeniu programu (zadeklarowaniu tablicy) i zapis tuż przed wyjściem.

Pozdrawiam i dziękuję za odpowiedzi =)

0

A nie dałoby się jakoś... Prościej? Niewiele zrozumiałem z tamtego posta, a nad zagadnieniem zapisania tablicy obiektów do pliku siedzę już 5 godzin.

Wymyśliłem coś takiego, na podstawie tekstu Zapis i odczyt struktur z plików binarnych to pestka a co z klasami gt; :
Metoda na zapis pojedynczego obiektu do pliku:

             void Zapisz(void) 
             { 
                 string czytelnik;
                 string numerCzytelnika;
                 char cztlnik[2];
                 sprintf( cztlnik,"%d", _id);
                 fstream plik;
                 plik.open(cztlnik, ios::out | ios::binary); 
                 plik.write((char*)this,sizeof(int)+sizeof(long) + sizeof(char)*100+2 ); 
                 plik.close(); 
             }

i potem taka pętla w kodzie głównym:

 for (int i=0; i<=LicznikCzytelnikow-1; i++)
 {czytelnicy[i].Zapisz();}

(Klasa to Czytelnik, tablica nazywa się czytelnicy, mam też zmienną deklarowaną w kodzie głównym która mówi mi ilu czytelników mam utworzonych)

Oraz coś takiego do odczytania:

             void odczytaj(void) 
                      { 
                      string czytelnik;
                      string numerCzytelnika;
                      char cztlnik[2];
                      sprintf( cztlnik,"%d", _id);
                      fstream plik; 
                      plik.open(cztlnik, ios::in | ios::binary); 
                      plik.read((char*)this,sizeof(int)+sizeof(long) + sizeof(char)*100+2 ); 
                      plik.close(); 
                      }

Oraz pętlę w kodzie głównym:

 for (int i=0; i<=LicznikCzytelnikow-1; i++)
 {czytelnicy[i].odczytaj();}

Objaw jest taki, że program zapisuje jakieś pliki o właściwych nazwach (tj. 1, 2, 3..LicznikCzytelnikow), mają te pliki jakiś rozmiar, ale po ponownym uruchomieniu nie wczytuje odpowiednich danych, tj. po wyświetleniu zmiennych lokalnych obiektu z tablicy wyrzuca puste pola (przy stringach) i losowe liczby (przy intach). Czy mogę prosić o podpowiedź, co robię źle? Czy ten sposób w ogóle nie ma prawa zadziałać?

0

Daj kod tej twojej klasy.

0
class Czytelnik
{
      private:
              string _imie;
              string _nazwisko;
              long _id;
      public:
             Czytelnik (int numerek)
             {
             cout<<"Wprowadz imie nowego czytelnika"<<endl;
             cin>>_imie;
             cout<<"Wprowadz nazwisko nowego czytelnika"<<endl;
             cin>>_nazwisko;
             _id=numerek+1;
             }
             Czytelnik ()             
             {}
             void WypiszDane ()
             {
             cout<<"Imie:\t\t"<<_imie<<endl;
             cout<<"Nazwisko:\t"<<_nazwisko<<endl;
             cout<<"Identyfikator:\t"<<_id<<endl;
             }
             void Wyszukaj (string imie, string nazwisko, int &id, int wybor)
             {
                  if (id==_id)
                  {id=_id;}
                  if ((imie==_imie)and (nazwisko==_nazwisko))
                  {id=_id;}
             }
             void Zapisz(void) 
             { 
                 string czytelnik;
                 string numerCzytelnika;
                 char cztlnik[2];
                 sprintf( cztlnik,"%d", _id);
                 fstream plik;
                 plik.open(cztlnik, ios::out | ios::binary); 
                 plik.write((char*)this,sizeof(int)+sizeof(long) + sizeof(char)*100+2 ); 
                 plik.close(); 
             };
             void odczytaj(void) 
                      { 
                      string czytelnik;
                      string numerCzytelnika;
                      char cztlnik[2];
                      sprintf( cztlnik,"%d", _id);
                      fstream plik; 
                      plik.open(cztlnik, ios::in | ios::binary); 
                      plik.read((char*)this,sizeof(int)+sizeof(long) + sizeof(char)*100+2 ); 
                      plik.close(); 
                      };
      };

Tak jak pisałem, jestem początkujący, więc za ewentualne niezgodności z ogólnie przyjętymi standardami przepraszam. Metody (oprócz dwóch ostatnich) spełniają swoją rolę w programie, dlatego są jakie są.

// Wklejam cały kod programu, po zmianach jakie mu jeszcze próbowałem nadać. Może ktoś akurat uruchomi i wywnioskuje co jest nie tak... W komentarzach są też moje próby uruchomienia tego na inne sposoby. Z góry dziękuję za wszelkie wskazówki... I jeszcze raz przepraszam za ewentualny "brzydko" napisany kod.

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
using namespace std;
class Czytelnik
{
      private:
              string _imie;
              string _nazwisko;
              long _id;
      public:
             Czytelnik (int numerek)
             {
             cout<<"Wprowadz imie nowego czytelnika"<<endl;
             cin>>_imie;
             cout<<"Wprowadz nazwisko nowego czytelnika"<<endl;
             cin>>_nazwisko;
             _id=numerek+1;
             }
             Czytelnik ()             
             {}
             void WypiszDane ()
             {
             cout<<"Imie:\t\t"<<_imie<<endl;
             cout<<"Nazwisko:\t"<<_nazwisko<<endl;
             cout<<"Identyfikator:\t"<<_id<<endl;
             }
             void Wyszukaj (string imie, string nazwisko, int &id, int wybor)
             {
                  if (id==_id)
                  {id=_id;}
                  if ((imie==_imie)and (nazwisko==_nazwisko))
                  {id=_id;}
             }
             void Zapisz(void) 
             { 
                 string czytelnik;
                 string numerCzytelnika;
                 char cztlnik[2];
                 sprintf( cztlnik,"%d", _id);
                 fstream plik;
                 plik.open(cztlnik, ios::out | ios::binary); 
                 //plik.write((char*)this,sizeof(int)+sizeof(long) + sizeof(char)*100+2 ); 
                 plik.write((char*)this,9999999 ); 
                 plik.close(); 
             };
             void Odczytaj(int numerek) 
                      { 
                      string czytelnik;
                      string numerCzytelnika;
                      char cztlnik[2];
                      sprintf( cztlnik,"%d", numerek+1);
                      fstream plik; 
                      plik.open(cztlnik, ios::in | ios::binary); 
                      //plik.read((char*)this,sizeof(int)+sizeof(long) + sizeof(char)*100+2 ); 
                      plik.read((char*)this,9999999); 
                      plik.close(); 
                      };
      };
      
class Ksiazka
{
      private:
              string _tytul;
              string _autor;
              int _rokWydania;
              bool _wypozyczona;
              int _wypozyczajacy;
              long _id;
      public:
             Ksiazka (int numerek)
             {
             _id=numerek+1;
             cout<<"Wprowadz tytul nowej ksiazki:"<<endl;
             cin>>_tytul;
             cout<<"Wprowadz imie i nazwisko autora:"<<endl;
             cin>>_autor;
             cout<<"Wprowadz rok wydania ksiazki:"<<endl;
             cin>>_rokWydania;
             _wypozyczona=0;
             _wypozyczajacy=0;
             }
             
             Ksiazka ()
             {}
             
             void WypiszDane (int &wypozyczajacy)
             {
             cout<<"Tytul:\t"<<_tytul<<endl;
             cout<<"Autor\t"<<_autor<<endl;
             cout<<"Rok wydania:\t"<<_rokWydania<<endl;
             cout<<"Identyfikator:\t"<<_id<<endl;
             if (_wypozyczona!=0)
                {
                                      cout<<"Wypozyczona przez: "<<endl;
                                      wypozyczajacy=_wypozyczajacy;
                }
             else
                 {
                 cout<<"Można wypozyczyc"<<endl;
                 wypozyczajacy=0;
                 }                    
             };
             void Wyszukaj (string tytul, string autor,int rokWydania, int &id, int wybor)
             {
                  if (id==_id)
                  {id=_id;}
                  if ((tytul==_tytul)and(autor==_autor)and(rokWydania==_rokWydania))
                  {id=_id;}
             };
             void Wypozycz (int idWypozyczajacego)
             {
                  _wypozyczajacy=idWypozyczajacego;
                  _wypozyczona="TRUE";
             };
             void Zwroc ()
             {
                  _wypozyczajacy=0;
                  _wypozyczona="FALSE";
             };
             bool SprawdzanieWypozyczenia ()
             {
                  if (_wypozyczona==0)
                  {return(0);}
                  else
                  {return(1);}
             };
};      
      
void Menu (int &wybor);

void MenuCzytelnicy (int &wybor);

void MenuKsiazki (int &wybor);

void MenuWypozyczenia (int &wybor);

int main ()
{
 int LicznikCzytelnikow=0;
 int LicznikKsiazek=0;
 Czytelnik czytelnicy [100];
 Ksiazka ksiazki [500];
 fstream PlikLicznikCzytelnikow;
 PlikLicznikCzytelnikow.open("licznikCzytelnikow.dat", ios::in);
 PlikLicznikCzytelnikow>>LicznikCzytelnikow;
 PlikLicznikCzytelnikow.close();
/* ifstream ifs("plik.foo", ios::binary); // otwieramy plik do odczytu binarnego
 char* temp = new char[sizeof(int)]; // tymczasowy bufor na dane
 ifs.read(temp, 999999); // wczytujemy dane do bufora
 //int* number1 = (int*)(temp); // rzutujemy zawartość bufora na typ int
 czytelnicy = (Czytelnik*)(temp);*/
 for (int i=0; i<=LicznikCzytelnikow-1; i++)
 {czytelnicy[i].Odczytaj(i);
 cout<<"Odczytano dane czytelnika :"<<i<<endl;}
 system ("pause");
 Poczatek:
 system("CLS");
 int Wybor=0;
 Menu(Wybor);
 int Opcja=0;
 system ("cls");
 int y=0;
 switch (Wybor)
 {
        case 1: {
                              MenuCzytelnicy (Opcja);
                              switch (Opcja)
                              {
                                     case 1: {
                                                      system ("cls");
                                                      cout<<"Zestawienie wszystkich czytelnikow:";
                                                      for (int i=0; i<=LicznikCzytelnikow-1; i++)
                                                      {
                                                      cout<<endl<<"Dane czytelnika:"<<endl;
                                                      czytelnicy[i].WypiszDane();
                                                      }
                                                      system ("PAUSE");
                                             }
                                             break; 
                                     case 2: {
                                                      WyszukajCzytelnika:
                                                      system ("cls");
                                                      int WyszukiwanieCzytelnika;
                                                      cout<<"Wyszukiwanie czytelnika:"<<endl;
                                                      cout<<"Wprowadz 1, jesli chcesz wyszukiwac wedlug identyfikatora czytelnika"<<endl;
                                                      cout<<"Wprowadz 2, jesli chcesz wyszukiwac wedlug imienia i nazwiska czytelnika"<<endl;
                                                      cin>>(WyszukiwanieCzytelnika);
                                                      int IdentyfikatorCzytelnika=150;
                                                      switch (WyszukiwanieCzytelnika)
                                                             {
                                                                            case 1: {
                                                                                    cout<<"Wprowadz identyfikator czytelnika"<<endl;
                                                                                    cin>>IdentyfikatorCzytelnika;
                                                                                    for (int i=0; i<=LicznikCzytelnikow-1; i++)
                                                                                        {
                                                                                             czytelnicy[i].Wyszukaj("a","b", IdentyfikatorCzytelnika, WyszukiwanieCzytelnika);
                                                                                        }                                                                                 
                                                                                    }
                                                                            break;
                                                                            case 2: {string Imie, Nazwisko;
                                                                                    cout<<"Wprowadz imie czytelnika"<<endl;
                                                                                    cin>>Imie;
                                                                                    cout<<"Wprowadz nazwisko czytelnika"<<endl;
                                                                                    cin>>Nazwisko;
                                                                                    for (int i=0; i<=LicznikCzytelnikow-1; i++)
                                                                                        {
                                                                                            czytelnicy[i].Wyszukaj(Imie,Nazwisko, IdentyfikatorCzytelnika, WyszukiwanieCzytelnika);
                                                                                        }   
                                                                                    }
                                                                            break;
                                                                            default:{cout <<"BLAD! Zly klawisz."<<endl;
                                                                            system ("PAUSE");
                                                                            goto WyszukajCzytelnika;}
                                                             }
                                                             czytelnicy[IdentyfikatorCzytelnika-1].WypiszDane();
                                                             system ("PAUSE");
                                             }
                                             break;       
                                     case 3: {
                                                      system ("cls");
                                                      cout<<"Dodawanie nowego czytelnika"<<endl;
                                                      czytelnicy[LicznikCzytelnikow]=Czytelnik(LicznikCzytelnikow);
                                                      cout<<"Wprowadzono czytelnika o nastepujacych danych:"<<endl;
                                                      czytelnicy[LicznikCzytelnikow].WypiszDane();
                                                      LicznikCzytelnikow++;
                                                      system ("PAUSE");
                                             }
                                             break;                                                                                                       
                              }
                }
                break;
        case 2:
               {
                              MenuKsiazki (Opcja);
                              switch (Opcja)
                              {
                                     case 1: {
                                                      system ("cls");
                                                      cout<<"Zestawienie wszystkich ksiazek:";
                                                      for (int i=0; i<=LicznikKsiazek-1; i++)
                                                      {
                                                      cout<<endl<<"Dane ksiazki:"<<endl;
                                                      ksiazki[i].WypiszDane(y);
                                                      }
                                                      system ("PAUSE");
                                             }
                                             break; 
                                     case 2: {
                                                      WyszukajKsiazke:
                                                      system ("cls");
                                                      int WyszukiwanieKsiazki;
                                                      cout<<"Wyszukiwanie ksiazki:"<<endl;
                                                      cout<<"Wprowadz 1, jesli chcesz wyszukiwac wedlug identyfikatora ksiazki"<<endl;
                                                      cout<<"Wprowadz 2, jesli chcesz wyszukiwac wedlug tytulu, autora i roku wydania"<<endl;
                                                      cin>>(WyszukiwanieKsiazki);
                                                      int IdentyfikatorKsiazki=550;
                                                      switch (WyszukiwanieKsiazki)
                                                             {
                                                                            case 1: {
                                                                                    cout<<"Wprowadz identyfikator ksiazki"<<endl;
                                                                                    cin>>IdentyfikatorKsiazki;
                                                                                    for (int i=0; i<=LicznikKsiazek-1; i++)
                                                                                        {
                                                                                             ksiazki[i].Wyszukaj("a","b",0000, IdentyfikatorKsiazki, WyszukiwanieKsiazki);
                                                                                        }                                                                                 
                                                                                    }
                                                                            break;
                                                                            case 2: {string Tytul, Autor;
                                                                                    int RokWydania;
                                                                                    cout<<"Wprowadz tytul ksiazki"<<endl;
                                                                                    cin>>Tytul;
                                                                                    cout<<"Wprowadz autora ksiazki"<<endl;
                                                                                    cin>>Autor;
                                                                                    cout<<"Wprowadz rok wydania ksiazki"<<endl;
                                                                                    cin>>RokWydania;
                                                                                    for (int i=0; i<=LicznikCzytelnikow-1; i++)
                                                                                        {
                                                                                            ksiazki[i].Wyszukaj(Tytul,Autor,RokWydania, IdentyfikatorKsiazki, WyszukiwanieKsiazki);
                                                                                        }   
                                                                                    }
                                                                            break;
                                                                            default:{cout <<"BLAD! Zly klawisz."<<endl;
                                                                            system ("PAUSE");
                                                                            goto WyszukajKsiazke;}
                                                             }
                                                             int Wypozyczajacy;
                                                             ksiazki[IdentyfikatorKsiazki-1].WypiszDane(Wypozyczajacy);
                                                             if (Wypozyczajacy!=0)
                                                             {
                                                                czytelnicy[Wypozyczajacy-1].WypiszDane();
                                                             }
                                                             system ("PAUSE");
                                             }
                                             break;       
                                     case 3: {
                                                      system ("cls");
                                                      cout<<"Dodawanie nowej ksiazki"<<endl;
                                                      ksiazki[LicznikKsiazek]=Ksiazka(LicznikKsiazek);
                                                      cout<<"Wprowadzono ksiazke o nastepujacych danych:"<<endl;
                                                      ksiazki[LicznikKsiazek].WypiszDane(y);
                                                      LicznikKsiazek++;
                                                      system ("PAUSE");
                                             }
                                             break;                                                                                                       
                              }

               }
               break;
        case 3:
               {
                              MenuWypozyczenia(Opcja);
                              switch (Opcja)
                              {
                                     case 1:{
                                             }
                                     break;
                                     case 2:{
                                             }
                                     break;
                                     case 3:{DodajWypozyczenie:
                                                 system("cls");
                                                 int IdKsiazki, IdCzytelnika;
                                                 cout<<"Wprowadź identyfikator ksiazki ktora chcesz wypozyczyc"<<endl;
                                                 cin>>IdKsiazki;
                                                 cout<<"Wprowadz identyfikator czytelnika wypozyczajacego"<<endl;
                                                 cin>>IdCzytelnika;
                                                 if ((IdKsiazki>LicznikKsiazek)or(IdCzytelnika>LicznikCzytelnikow))
                                                 {cout<<"Nie ma w bazie ksiazki lub czytelnika o wpisanym identyfikatorze. Sprobuj ponownie."<<endl;
                                                 system("Pause");
                                                 goto DodajWypozyczenie;
                                                 }
                                                 if (ksiazki[IdKsiazki-1].SprawdzanieWypozyczenia()!=0)
                                                 {cout<<"Ta ksiazka jest juz wypozyczona!"<<endl;
                                                 system("pause");}
                                                 else
                                                 {ksiazki[IdKsiazki-1].Wypozycz(IdCzytelnika);
                                                 ksiazki[IdKsiazki-1].WypiszDane(IdCzytelnika);
                                                 czytelnicy[IdCzytelnika-1].WypiszDane();
                                                 system ("PAUSE");}
                                                 
                                             }
                                     break;
                                     case 4: {
                                          
                                             }
                                     break;       
                              }
               }
               break;
        default:
                {if (Wybor!=0)
                {cout<<"BLAD! Wprowadzono nieznany znak. "<<endl;
                system("PAUSE");}
                }
 }
 if (Wybor!=0)
 {goto Poczatek;}
 PlikLicznikCzytelnikow.open("licznikCzytelnikow.dat", ios::out);
 PlikLicznikCzytelnikow<<LicznikCzytelnikow<<endl;
 PlikLicznikCzytelnikow.close();
 for (int i=0; i<=LicznikCzytelnikow-1; i++)
 {czytelnicy[i].Zapisz();}
/* fstream PlikCzytelnicy;
 PlikCzytelnicy.open("tablicaCzytelnicy.dar", ios::binary); 
// for(int i=0;i<99;i++)
 char* temp = new char[999999];
 PlikCzytelnicy.read(temp,999999);
// PlikCzytelnicy.write(x,9999999);
// {PlikCzytelnicy<<czytelnicy[i]<<endl;} //<---- ...i jej elementy
*/
/* ofstream ofs("plik.foo", ios::binary); // otwieramy plik do zapisu binarnego
 
 ofs.write((char*)(czytelnicy), 999999); // zapisujemy dane do pliku*/
 return 0;   
}
void Menu (int &wybor)
{
     cout<<"Wybierz z klawiatury numerycznej:"<<endl;
     cout<<"1 - przejdz do dzialu czytelnikow."<<endl;
     cout<<"2 - przejdz do dzialu ksiazek."<<endl;
     cout<<"3 - przejdz do dzialu wypozyczen."<<endl;
     cout<<"0 - natychmiastowe wyjscie."<<endl;
     cin>>(wybor);
};
void MenuCzytelnicy (int &wybor)
{
    cout<<"Wybierz ponownie z klawiatury numerycznej:"<<endl;
    cout<<"1 - wyswietl wszystkich czytelnikow"<<endl;
    cout<<"2 - wyszukaj czytelnika"<<endl;
    cout<<"3 - dodaj czytelnika"<<endl;
    cin>>(wybor);
};
void MenuKsiazki (int &wybor)
{
    cout<<"Wybierz ponownie z klawiatury numerycznej:"<<endl;
    cout<<"1 - wyswietl wszystkie ksiazki"<<endl;
    cout<<"2 - wyszukaj ksiazke"<<endl;
    cout<<"3 - dodaj ksiazke"<<endl;
    cin>>(wybor);

};

void MenuWypozyczenia (int &wybor)
{
    cout<<"Wybierz ponownie z klawiatury numerycznej:"<<endl;
    cout<<"1 - aby pokazac wypozyczenia wskazanego czytelnika"<<endl;
    cout<<"2 - aby pokazac kto wypozycza dana ksiazke"<<endl;
    cout<<"3 - aby dodac wypozyczenie"<<endl;
    cout<<"4 - aby usunac wypozyczenie"<<endl;
    cin>>(wybor);
};
1

Hm, no niezły bajzel tym kodzie.

Przykładowa klasa Czytelnik oraz kolekcja, która je przechowuje:

Reader.hpp

#pragma once

#include <iostream>
#include <sstream>

#include "Utils.hpp"

using namespace std;

class Reader
{
private:
	int id;
	string firstname;
	string lastname;
public:
	Reader(int id, string firstname, string lastname);
	Reader(istream& stream);
	int GetId();
	void Serialize(ostream& stream);
	string ToString();
};

Reader.cpp

#include "Reader.hpp"

Reader::Reader(int id, string firstname, string lastname)
{
	this->id = id;
	this->firstname = firstname;
	this->lastname = lastname;
}

Reader::Reader(istream& stream)
{
	this->id = Utils::Read<int>(stream);
	this->firstname = Utils::Read<string>(stream);
	this->lastname = Utils::Read<string>(stream);
}

int Reader::GetId()
{
	return id;
}

void Reader::Serialize(ostream& stream)
{
	Utils::Write(stream, id);
	Utils::Write<string>(stream, firstname);
	Utils::Write<string>(stream, lastname);
}

string Reader::ToString()
{
	ostringstream buffer;

	buffer << id << ": " << firstname << " " << lastname;

	return buffer.str();
}

ReaderCollection.hpp

#pragma once

#include <vector>

#include "Reader.hpp"

using namespace std;

class ReaderCollection
{
private:
	vector<Reader*> readers;
public:
	ReaderCollection(void);
	ReaderCollection(istream& stream);
	const vector<Reader*>& GetReaders() const;
	void Add(string firstname, string lastname);
	void Remove(Reader* reader);
	void Serialize(ostream& stream);
	~ReaderCollection(void);
};

ReaderCollection.cpp

#include "ReaderCollection.hpp"


ReaderCollection::ReaderCollection(void)
{
	
}

ReaderCollection::ReaderCollection(istream& stream)
{
	int count = Utils::Read<int>(stream);

	for(int i = 0; i < count; i++)
		readers.push_back(new Reader(stream));
}

const vector<Reader*>& ReaderCollection::GetReaders() const
{
	return readers;
}

void ReaderCollection::Add(string firstname, string lastname)
{
	int lastId = -1;
	if(readers.size() > 0)
	{
		vector<Reader*>::reverse_iterator it = readers.rbegin();
		lastId = (*it)->GetId();
	}

	Reader* reader = new Reader(lastId + 1, firstname, lastname);
	readers.push_back(reader);
}

void ReaderCollection::Remove(Reader* reader)
{
	vector<Reader*>::iterator it;
	for(it = readers.begin(); it != readers.end(); it++)
		if(*it == reader)
		{
			delete *it;
			readers.erase(it);
			return;
		}
}

void ReaderCollection::Serialize(ostream& stream)
{
	Utils::Write(stream, readers.size());

	vector<Reader*>::iterator it;
	for(it = readers.begin(); it != readers.end(); it++)
		(*it)->Serialize(stream);
}

ReaderCollection::~ReaderCollection(void)
{
	vector<Reader*>::iterator it;
	for(it = readers.begin(); it != readers.end(); it++)
		delete *it;
}

Sposób wykorzystania:

#include <iostream>
#include <fstream>

#include "Reader.hpp"
#include "ReaderCollection.hpp"

using namespace std;

int main()
{
	ReaderCollection collection;
	collection.Add("Jestesmy", "W Mediolanie!");
	collection.Add("Krzysztof", "Ibisz");
	collection.Add("Barbra", "Streisand");

	vector<Reader*> readers = collection.GetReaders();
	vector<Reader*>::iterator it;
	for(it = readers.begin(); it != readers.end(); it++)
		cout << (*it)->ToString().c_str() << endl;

	cout << endl;

	// zapisywanie
	ofstream saveFile("test.bin", ofstream::out | ofstream::binary | ofstream::trunc);
	
	collection.Serialize(saveFile);
	
	saveFile.close();

	// wczytywanie
	ifstream loadFile("test.bin", ifstream::in | ifstream::binary);

	ReaderCollection loadedCollection(loadFile);

	loadFile.close();

	vector<Reader*> loadedReaders = loadedCollection.GetReaders();
	for(it = loadedReaders.begin(); it != loadedReaders.end(); it++)
		cout << (*it)->ToString().c_str() << endl;

	return 0;
}

Do tego plik Utils.hpp, którego zawartość jest w linku, który podałem w swoim pierwszym poście.

Hm, nie mówię, że mój kod jest idealny, ale wychodzę z założenia, że albo robimy coś dobrze albo w ogóle. Jeżeli nie jestem pewien czy coś jest zrobione poprawnie, to pytam, a nie robię jak mi się wydaje.
Przykładowo, w twoim kodzie w klasie czytelnik masz metodę, która bezpośrednio z konsoli pobiera imię i nazwisko - przecież to w ogóle nie jest działka tej klasy, tylko interfejsu.

0

Ogromnie dziękuję za rozpisanie kodu! Mam tylko nadzieję że wszystko na czas zrozumiem.
Vector jest tablicą, więc jeśli dobrze rozumiem to w kodzie głównym tworzę obiekt klasy (ReaderCollection), w której dopiero jedna z metod tworzy tablicę (Vector) której dane są typu klasy którą chciałem mieć (Reader)?

btw - to wszysko znacznie przewyższa poziom na jakim jestem, ale skoro już się za to wziąłem to postaram skończyć... Chociaż gdybym wiedział że wymaga to poznania aż tylu nowych rzeczy to chybabym się teraz nie zdecydował.

0

To są zupełne podstawy. Obiektowość, kontenery STL.

To trochę jak jazda samochodem. Pewnie, że możesz jeździć nie wiedząc, że da się zmieniać biegi, ale jakość jazdy będzie mierna. Możesz jeździć dobrze, wiedząc, że masz skrzynię biegów, ale jeździć najlepiej będziesz, gdy poznasz mechanikę działania samochodu.

Ty jesteś na etapie 'co robi ten pedał z lewej?' ;).

0

Jakby to ująć... Podstawa programowa dla przedmiotu "Programowanie strukturalne i obiektowe" do kształcenia w zawodzie "Technik informatyk" zakłada tyle ile umiem po jednym semestrze c++. ^^
Nie wiem, może nauczyciel tak się do tego zabiera... Ja mimo wszystko ciągle myślę strukturalnie, Turbo Pascalowo, a niekoniecznie obiektowo. Nie mieliśmy słowa o klasie Vector, parę słów o tym że istnieją tablice, że można pętlą wylosować tablicę x elementów i posortować bąbelkowo, albo odnaleźć największą. Dlatego to co chcę napisać sprawia mi tyle trudności. Kontener STL słyszę pierwszy raz w życiu.

Dobra, przyznaję się. na razie nie wiem jak się do tego zabrać. Jak mogę odwołać się do danych konkretnego czytelnika? Żeby je wypisać, lub użyć w programie?

zaczynałbym pewnie od: "collection." , ale nie mam pojęcia co dalej. Może "collection.readers.firstname"? Nie wiem czy tak się da, a nawet jakby się dało to nie przejdzie, bo readers jest private.

Ogólnie to mi kompilator wrzeszczy o różne rzeczy w projekcie, z których nic nie wiem, więc może na koniec... Taki zbiór punktów - problemów do wyszukania i poczytania?

1 użytkowników online, w tym zalogowanych: 0, gości: 1