Wykład 11
Zarządzanie danymi - zapis/odczyt w pliku - cd 11.1. Mapa aplikacji – kolekcja formatów zapisu i odczytu z pliku,
odtwarzanie obiektów wraz z powiązaniami
Plik nagłówkowy
#ifndef M_BIBL
#define M_BIBL
#include "Mapa_kl.h"
#include "F_Tyt4.h"
#include "F_Poz.h"
#include "F_kol.h"
#include "F_Wyp.h"
#include "F_Rez.h"
#include "F_klient.h"
#include "Tab_Ob.h"
#include "Form_Tob.h"
extern TKol3<TTytul> Zasoby;
extern TKol3<TPozycja> Pozycje;
extern TKol3<TDane_klienta> Klienci;
extern TKol3<TWypozyczenie> Wypozyczenia;
extern TKol3<TRezerwacja> Rezerwacje;
class Mapa_bibl: public Mapa_klas {public: Mapa_bibl()
{Format_tablicy_obiektow * Ftab_obiektow=
new Format_tablicy_obiektow;
formaty.Zmien(1);formaty.Wstaw(Ftab_obiektow,TABLICA_OB);
Format_kolekcji* FKol1=new Format_kolekcji;
formaty.Zmien(1);formaty.Wstaw(FKol1,KOLEKCJA);
Format_tytulu* Ftytul=new Format_tytulu;
formaty.Zmien(1);formaty.Wstaw(Ftytul,TYTUL);
Format_pozycji* Fpozycja=new Format_pozycji;
formaty.Zmien(1);formaty.Wstaw(Fpozycja,POZYCJA);
Format_klienta*Fklient=new Format_klienta;
formaty.Zmien(1); formaty.Wstaw(Fklient,KLIENT);
Format_wypozyczenia* Fwypozyczenie=new Format_wypozyczenia;
formaty.Zmien(1); formaty.Wstaw(Fwypozyczenie,WYPOZYCZENIE);
Format_rezerwacji* Frezerwacja=new Format_rezerwacji;
formaty.Zmien(1); formaty.Wstaw(Frezerwacja,REZERWACJA);
}
~Mapa_bibl() {}
int Kod_klasy_tablicy() {return TABLICA_OB;}
void Odtworz_obiekt(int ID_obiektu, int kod_klasy, Tablica_obiektow* _tablica_obiektow);
};
#endif
Plik modułowy
#include "M_bibl1.h"
void Mapa_bibl::Odtworz_obiekt(int ID_obiektu, int kod_klasy, Tablica_obiektow* _tablica_obiektow)
{PDC_Obiekt* pdc_obiekt;
PDC_Obiekt*kol[5]={&Zasoby,&Pozycje,&Klienci, &Wypozyczenia,&Rezerwacje};
static int ile=0;
switch (kod_klasy) {case KOLEKCJA:
if (ile<5)
{kol[ile++]->Nadaj_obiekt_ID(ID_obiektu);
_tablica_obiektow->Zarejestruj_obiekt(ID_obiektu,kol[ile-1]);
} break;
case TYTUL:
pdc_obiekt=new TTytul("","","",&Pozycje,&Rezerwacje);
pdc_obiekt->Nadaj_obiekt_ID(ID_obiektu);
_tablica_obiektow->Zarejestruj_obiekt(ID_obiektu,pdc_obiekt);
static int t=0;
Zasoby.Zmien(1);Zasoby.Wstaw((TTytul*)pdc_obiekt,t++); break;
case POZYCJA:
pdc_obiekt= new TPozycja;
pdc_obiekt->Nadaj_obiekt_ID(ID_obiektu);
_tablica_obiektow->Zarejestruj_obiekt(ID_obiektu,pdc_obiekt);
static int p=0; Pozycje.Zmien(1);
Pozycje.Wstaw((TPozycja*)pdc_obiekt,p++); break;
case WYPOZYCZENIE:
pdc_obiekt= new TWypozyczenie;
pdc_obiekt->Nadaj_obiekt_ID(ID_obiektu);
_tablica_obiektow->Zarejestruj_obiekt(ID_obiektu,pdc_obiekt);
static int w=0; Wypozyczenia.Zmien(1);
Wypozyczenia.Wstaw((TWypozyczenie*)pdc_obiekt,w++); break;
case REZERWACJA:
pdc_obiekt= new TRezerwacja;
pdc_obiekt->Nadaj_obiekt_ID(ID_obiektu);
_tablica_obiektow->Zarejestruj_obiekt(ID_obiektu,pdc_obiekt);
static int r=0; Rezerwacje.Zmien(1);
Rezerwacje.Wstaw((TRezerwacja*)pdc_obiekt,r++); break;
case KLIENT:
pdc_obiekt= new TDane_klienta(0,"","","","",&Wypozyczenia, &Rezerwacje);
pdc_obiekt->Nadaj_obiekt_ID(ID_obiektu);
_tablica_obiektow->Zarejestruj_obiekt(ID_obiektu,pdc_obiekt);
static int k=0; Klienci.Zmien(1);
Klienci.Wstaw((TDane_klienta*)pdc_obiekt,k++); break;
11.2 Formaty zapisu i odczytu obiektów aplikacji
Format dla klasy TTytul#ifndef FTYT4.H
#define FTYT4.H
#include "TTytul4.h"
#include "Form_PDC.h"
extern TKol3<TPozycja> Pozycje;
class Format_tytulu:public Format_PDC_obiektow<TTytul>
{ public:
Format_tytulu() {}
~Format_tytulu() {}
void Zachowaj_nazwe_klasy(ofstream& plik_wy)
{Zachowaj_naglowek(plik_wy,"Nazwa_klasy", "TTytul");}
void Zachowaj_atrybuty(ofstream& plik_wy) { plik_wy<<'<'<<pdc_obiekt->nazwa<<endl <<pdc_obiekt->autor<<endl
<<pdc_obiekt->ISBN<<endl;}
void Odtworz_atrybuty(ifstream& plik_we) { char znak;
plik_we.get(znak);
plik_we>>pdc_obiekt->nazwa;
plik_we>>pdc_obiekt->autor;
plik_we>>pdc_obiekt->ISBN;
plik_we.get(znak);}
};
#endif
Format dla klasy TKol1#ifndef F_KOL
#define F_KOL
#include "Kol1_3.h"
#include "Form_PDC.h"
#include "PDC_ob.h"
class Format_kolekcji:public Format_PDC_obiektow <PDC_Obiekt>
{public:
Format_kolekcji() {}
~Format_kolekcji() {}
void Zachowaj_nazwe_klasy(ofstream& plik_wy)
{Zachowaj_naglowek(plik_wy,"Nazwa_klasy", "TKol1");}
void Zachowaj_atrybuty(ofstream& plik_wy)
{plik_wy<<'<'<<((TKol1<PDC_Obiekt>*)pdc_obiekt)->ile<<endl;}
void Odtworz_atrybuty(ifstream& plik_we) { char znak;
plik_we.get(znak);
plik_we>>((TKol1<PDC_Obiekt>*)pdc_obiekt)->ile;
plik_we.get(znak);}
};
#endif
Format dla klasy TDane_klienta#ifndef FKLient5.H
#define FKlient5.H
#include "TKlient5.h"
#include "Form_PDC.h"
extern TKol3<TPozycja> Pozycje;
class Format_klienta:public Format_PDC_obiektow<TDane_klienta>
{ public:
Format_klienta() {}
~Format_klienta() {}
void Zachowaj_nazwe_klasy(ofstream& plik_wy)
{Zachowaj_naglowek(plik_wy,"Nazwa_klasy", "TDane_klienta");}
void Zachowaj_atrybuty(ofstream& plik_wy) {int n; char a[dl], b[dl], c[dl], d[dl];
pdc_obiekt->Podaj_dane_klienta(n,a,b,c,d);
plik_wy<<'<'<<n<<endl <<a<<endl
<<b<<endl <<c<<endl <<c<<endl;
}
void Odtworz_atrybuty(ifstream& plik_we) { char znak,a[dl],b[dl],c[dl],d[dl];int n;
plik_we.get(znak);
plik_we>>n;
plik_we>>a;
plik_we>>b;
plik_we>>c;
plik_we>>d;
plik_we.get(znak);
pdc_obiekt->Nadaj_dane_klienta(n,a,b,c,d);
} };#endif
Format dla klasy TPozycja#ifndef F_POZ.H
#define F_POZ.H
#include "TPoz3.h"
#include "Form_PDC.h"
class Format_pozycji:public Format_PDC_obiektow<TPozycja>
{ public: Format_pozycji() {}
~Format_pozycji() {}
void Zachowaj_nazwe_klasy(ofstream& plik_wy)
{Zachowaj_naglowek(plik_wy,"Nazwa_klasy", "TPozycja");}
void Zachowaj_atrybuty(ofstream& plik_wy)
{ plik_wy<<'<'<<pdc_obiekt->Podaj_Numer()<<endl;}
void Odtworz_atrybuty(ifstream& plik_we) { char znak;int pom; plik_we.get(znak);
plik_we>>pom; pdc_obiekt->Nadaj_numer(pom);
plik_we.get(znak);}
void Zachowaj_powiazania(ofstream&);
void Odtworz_powiazania(ifstream&, Tablica_obiektow*);
};
#endif
#include "F_Poz.h"
#include "TTytul4.h"
#include "TWyp1.h"
#include "Tab_ob.h"
void Format_pozycji:: Zachowaj_powiazania(ofstream& plik_wy) { TTytul* pom1=pdc_obiekt->Podaj_tytul();
int obiekt_ID=pom1->Podaj_obiekt_ID();
Zachowaj_etykiete(plik_wy,"TTytul");
Zachowaj_ID(plik_wy,obiekt_ID);
TWypozyczenie* pom2=pdc_obiekt->Podaj_wypozyczenie();
Zachowaj_etykiete(plik_wy,"TWypozyczenie");
if (pom2!=NULL)obiekt_ID=pom2->Podaj_obiekt_ID();
else obiekt_ID=-1;
Zachowaj_ID(plik_wy,obiekt_ID);}
void Format_pozycji::Odtworz_powiazania(ifstream& plik_we, Tablica_obiektow*tablica_obiektow) {if(Odtworz_etykiete(plik_we,"TTytul")!=0)
{int obiekt_ID=Odtworz_ID(plik_we);
TTytul*pom1=(TTytul*)(tablica_obiektow->Obiekt_ID(obiekt_ID));
pdc_obiekt->Nadaj_tytul(pom1);}
if(Odtworz_etykiete(plik_we,"TWypozyczenie")!=0) {int obiekt_ID=Odtworz_ID(plik_we);
TWypozyczenie*pom2;
if (obiekt_ID!=-1)
pom2=(TWypozyczenie*)(tablica_obiektow->Obiekt_ID(obiekt_ID));
else pom2=NULL;
pdc_obiekt->Nadaj_wypozyczenie(pom2);}}
Format dla klasy TRezerwacja#ifndef F_REZ.H
#define F_REZ.H
#include "TRez1.h"
#include "Form_PDC.h"
class Format_rezerwacji:public Format_PDC_obiektow<TRezerwacja>
{ public:
Format_rezerwacji() {}
~Format_rezerwacji() {}
void Zachowaj_nazwe_klasy(ofstream& plik_wy)
{Zachowaj_naglowek(plik_wy,"Nazwa_klasy", "TRezerwacja");}
void Zachowaj_powiazania(ofstream&);
void Odtworz_powiazania(ifstream&, Tablica_obiektow*);
};#endif
#include "F_Rez.h"
#include "TTytul4.h"
#include "TKlient5.h"
#include "Tab_ob.h"
void Format_rezerwacji:: Zachowaj_powiazania(ofstream& plik_wy) { TTytul* pom1=pdc_obiekt->Podaj_tytul();
int obiekt_ID=pom1->Podaj_obiekt_ID();
Zachowaj_etykiete(plik_wy,"TTytul");
Zachowaj_ID(plik_wy,obiekt_ID);
TDane_klienta* pom2=pdc_obiekt->Podaj_klienta();
obiekt_ID=pom2->Podaj_obiekt_ID();
Zachowaj_etykiete(plik_wy,"TDane_klienta");
Zachowaj_ID(plik_wy,obiekt_ID);
}void Format_rezerwacji::Odtworz_powiazania(ifstream& plik_we, Tablica_obiektow*tablica_obiektow)
{if(Odtworz_etykiete(plik_we,"TTytul")!=0) {int obiekt_ID=Odtworz_ID(plik_we);
TTytul*pom=(TTytul*)(tablica_obiektow->Obiekt_ID(obiekt_ID));
pdc_obiekt->Nadaj_tytul(pom); }
if(Odtworz_etykiete(plik_we,"TDane_klienta")!=0) {int obiekt_ID=Odtworz_ID(plik_we);
TDane_klienta*pom=
(TDane_klienta*)(tablica_obiektow->Obiekt_ID(obiekt_ID));
pdc_obiekt->Nadaj_klienta(pom);}}
Format dla klasy TWypozyczenie#ifndef F_WYP.H
#define F_WYP.H
#include "TWyp1.h"
#include "Form_PDC.h"
class Format_wypozyczenia:
public Format_PDC_obiektow<TWypozyczenie>
{ public:
Format_wypozyczenia() {}
~Format_wypozyczenia() {}
void Zachowaj_nazwe_klasy(ofstream& plik_wy)
{Zachowaj_naglowek(plik_wy,"Nazwa_klasy", "TWypozyczenie");}
void Zachowaj_powiazania(ofstream&);
void Odtworz_powiazania(ifstream&, Tablica_obiektow*);
};#endif
#include "F_Wyp.h"
#include "TPoz3.h"
#include "TKlient5.h"
#include "Tab_ob.h"
void Format_wypozyczenia::Zachowaj_powiazania(ofstream& plik_wy) { TPozycja* pom1=pdc_obiekt->Podaj_pozycje();
int obiekt_ID=pom1->Podaj_obiekt_ID();
Zachowaj_etykiete(plik_wy,"TPozycja");
Zachowaj_ID(plik_wy,obiekt_ID);
TDane_klienta* pom2=pdc_obiekt->Podaj_klienta();
obiekt_ID=pom2->Podaj_obiekt_ID();
Zachowaj_etykiete(plik_wy,"TDane_klienta");
Zachowaj_ID(plik_wy,obiekt_ID);
}void Format_wypozyczenia::Odtworz_powiazania(ifstream& plik_we, Tablica_obiektow*tablica_obiektow) {if(Odtworz_etykiete(plik_we,"TPozycja")!=0)
{int obiekt_ID=Odtworz_ID(plik_we);
Pozycja*pom=(TPozycja*)(tablica_obiektow->Obiekt_ID(obiekt_ID));
pdc_obiekt->Nadaj_pozycje(pom);}
if(Odtworz_etykiete(plik_we,"TDane_klienta")!=0) {int obiekt_ID=Odtworz_ID(plik_we);
TDane_klienta*pom=
(TDane_klienta*)(tablica_obiektow->Obiekt_ID(obiekt_ID));
pdc_obiekt->Nadaj_klienta(pom);
}}
11.3. Zapis do pliku
#include "M_bibl1.h"
#include "TTytul4.h"
#include "TPoz3.h"
#include "kol2_2.h"
#include "TKlient5.h"
#include "TWyp1.h"
#include "TRez1.h"
void Wstaw_tytul(char*, char*, char*);
void Zwieksz_zasob(char*,int);
void Zmniejsz_zasob(char*,int);
void Szukaj_wyswietl_zasob(char*);
void Wypozycz_zasob(int,char*);
void Zwroc_zasob(int,int);
void Wypozycz_zasob_lub_zarezerwuj(int,char*);
void Wypozycz_zarezerwowany_zasob(int,char* );
void Wstaw_klienta(char*, char*, char*, char*,int);
void Szukaj_wyswietl(char*);
void Szukaj_wyswietl(int);
TKol3<TDane_klienta> Klienci;
TKol3<TTytul> Zasoby;
TKol3<TPozycja> Pozycje;
TKol3<TWypozyczenie> Wypozyczenia;
TKol3<TRezerwacja> Rezerwacje;
void main() { clrscr();
//wstaw kilka ksiazek o niepowtarzalnym tytule Wstaw_tytul("Tytul4","4","4");
Wstaw_tytul("Tytul1","1","1");
Wstaw_tytul("Tytul3","3","3");
Wstaw_tytul("Tytul2","2","2");
cout<<Zasoby<<endl;
//sortowanie wg tytulu -
Zasoby.Sortuj(Porownaj_wg_Tytulu);
cout<<Zasoby<<endl;
//szukanie binarne bez powtorzen wg tytulu Szukaj_wyswietl_zasob("Tytul1");
Szukaj_wyswietl_zasob("Tytul2");
Szukaj_wyswietl_zasob("Tytul5");
Zwieksz_zasob("Tytul1",1);
Zwieksz_zasob("Tytul2",1);
Zwieksz_zasob("Tytul8",2);
Zwieksz_zasob("Tytul2",2);
Zwieksz_zasob("Tytul3",3);
Zwieksz_zasob("Tytul4",4);
Zwieksz_zasob("Tytul1",5);
cout<<Pozycje<<endl;
Zmniejsz_zasob("Tytul1",1);
cout<<Pozycje<<endl;
//sortowanie wg numeru - kazda pozycja ma inny numer Pozycje.Sortuj(Porownaj_wg_Numeru);
cout<<Pozycje<<endl;
//wstaw kilku klientow o niepowtarzalnym numerze Wstaw_klienta("Kowalski","1","1","1",2);
Wstaw_klienta("Nowak","2","2","2",2);
Wstaw_klienta("Adamiak","3","3","3",1);
Wstaw_klienta("Walczak","4","4","4",3);
cout<<Klienci<<endl;
//sortowanie wg nazwiska - moze byc wiele osob o tym samym nazwisku Klienci.Sortuj(Porownaj_wg_Nazwiska);
cout<<Klienci<<endl;
//szukanie binarne z powtorzeniami wg nazwiska Szukaj_wyswietl("Kowalski");
Szukaj_wyswietl("Walczak");
Szukaj_wyswietl("Kowal");
//sortowanie wg numeru - kazda osoba ma inny numer Klienci.Sortuj(Porownaj_wg_Numeru);
cout<<Klienci<<endl;
//szukanie binarne bez powtorzen wg numeru Szukaj_wyswietl(1);
Szukaj_wyswietl(3);
Szukaj_wyswietl(4);
Wypozycz_zasob(2,"Tytul1"); //numer 5 Wypozycz_zasob(2,"Tytul2"); //numer2
cout<<"\nWypozyczenia"<<endl<<Wypozyczenia<<endl;
cout<<"\nPozycje"<<endl<<Pozycje<<endl;
Zwroc_zasob(2,5);
cout<<"\nWypozyczenia po zwrocie"<<endl<<Wypozyczenia<<endl;
cout<<"\nPozycje po zwrocie"<<endl<<Pozycje<<endl;
//rezerwacja: we: nazwisko klienta oraz tytul //wy: wypozyczenie albo rezerwacja
Wypozycz_zasob_lub_zarezerwuj(4,"Tytul2");
Wypozycz_zasob_lub_zarezerwuj(3,"Tytul2");
cout<<"\nWypozyczenia\n"<<Wypozyczenia<<endl;
cout<<"\nRezerwacje\n"<<Rezerwacje<<endl;
//Zapis obiektów
Tablica_obiektow tablica_obiektow;
Mapa_bibl* mapa_bibl= new Mapa_bibl;
tablica_obiektow.Nadaj_mape_klas(mapa_bibl);
Zasoby.Zarejestruj_w_tablicy(&tablica_obiektow);
Pozycje.Zarejestruj_w_tablicy(&tablica_obiektow);
Klienci.Zarejestruj_w_tablicy(&tablica_obiektow);
Wypozyczenia.Zarejestruj_w_tablicy(&tablica_obiektow);
Rezerwacje.Zarejestruj_w_tablicy(&tablica_obiektow);
tablica_obiektow.Zapisz("prob1.txt");
Rezerwacje.Usun_kolekcje();
Wypozyczenia.Usun_kolekcje();
Pozycje.Usun_kolekcje();
Klienci.Usun_kolekcje();
Zasoby.Usun_kolekcje();
getch();
}
11.4. Odczyt z pliku
#include "M_bibl1.h"
#include "TTytul4.h"
#include "TPoz3.h"
#include "kol2_2.h"
#include "TKlient5.h"
#include "TWyp1.h"
#include "TRez1.h"
void Wstaw_tytul(char*, char*, char*);
void Zwieksz_zasob(char*,int);
void Zmniejsz_zasob(char*,int);
void Szukaj_wyswietl_zasob(char*);
void Wypozycz_zasob(int,char*);
void Zwroc_zasob(int,int);
void Wypozycz_zasob_lub_zarezerwuj(int,char*);
void Wypozycz_zarezerwowany_zasob(int,char* );
void Wstaw_klienta(char*, char*, char*, char*,int);
void Szukaj_wyswietl(char*);
void Szukaj_wyswietl(int);
TKol3<TDane_klienta> Klienci;
TKol3<TTytul> Zasoby;
TKol3<TPozycja> Pozycje;
TKol3<TWypozyczenie> Wypozyczenia;
TKol3<TRezerwacja> Rezerwacje;
void main() { clrscr();
//Odczyt obiektów
Tablica_obiektow tablica_obiektow;
Mapa_bibl* mapa_bibl= new Mapa_bibl;
tablica_obiektow.Nadaj_mape_klas(mapa_bibl);
tablica_obiektow.Odczytaj("prob1.txt");
tablica_obiektow.Zapisz("prob2.txt");
cout<<"\nZasoby\n"<<Zasoby<<endl;
cout<<"\nPozycje\n"<<Pozycje<<endl;
cout<<"\nKlienci\n"<<Klienci<<endl;
cout<<"\nWypozyczenia\n"<<Wypozyczenia<<endl;
cout<<"\nRezerwacje\n"<<Rezerwacje<<endl;
Rezerwacje.Usun_kolekcje();
Wypozyczenia.Usun_kolekcje();
Pozycje.Usun_kolekcje();
Klienci.Usun_kolekcje();
Zasoby.Usun_kolekcje();
getch();
}