Pliki

Transkrypt

Pliki
Laboratorium 2 – przygotowanie danych testowych
W projekcie można wykorzystać proste klasy będące agregatami danych. Są to klasy bez
zdefiniowanych konstruktorów, których wszystkie składowe są publiczne. Ponadto klasy te nie
dziedziczą z innych klas ani też nie mają metod wirtualnych. Mogą jednak posiadać składowe, które
także są obiektami klas będących agregatami.
Przykład
const int MAX=3;
class MalyObiekt{
public:
string nazwa;
int wartosc;
};
class DuzyObiekt{
public:
string nazwa;
int dane[MAX];
char symbol;
float wartosc;
MalyObiekt dodatek;
float ObliczIloczyn(); //agregaty mogą mieć metody
};
Obiekty z klas będących agregatami możemy zainicjalizować za pomocą listy wartości podanej w
nawiasach klamrowych. Uwaga, agregaty są tworzone na stosie.
void WpiszDanePrzykladowe(vector<DuzyObiekt> &a){
DuzyObiekt obiekt={"Dane1",{1,2,3},'a',35.789,{"Dane 1.1",20}};
a.push_back(obiekt);
}
Przykład jak możemy odwoływać się do obiektów.
void WyswietlDane(vector<DuzyObiekt> &a){
for(int i=0;i<a.size();i++){
cout<<a[i].nazwa<<endl;
cout<<a[i].dane[0]<<" "<<a[i].dane[1]<<endl;
cout<<a[i].dodatek.nazwa<<endl;
cout<<"Iloczyn="<<a[i].ObliczIloczyn()<<endl;
}
}
float DuzyObiekt::ObliczIloczyn(){
return wartosc*dodatek.wartosc;
}
Dane testowe należy pobierać z pliku. Przykład odczytu danych dla powyżej zdefiniowanych klas.
Korzystamy z biblioteki fstream.
void PobierzDaneZpliku(vector<DuzyObiekt> &a, string sciezka){
ifstream plik(sciezka); // Otwarcie pliku do odczytu
if(plik.is_open())
{
//zakładamy poprawną budowę pliku!!
string nazwa,nazwaD;
int dane[MAX];
float wartosc;
int wartoscD;
char symbol;
DuzyObiekt x;
while(!plik.eof()){
plik>>nazwa;
plik>>dane[0];
plik>>dane[1];
plik>>dane[2];
plik>>symbol;
plik>>wartosc;
plik>>nazwaD;
plik>>wartoscD;
x={nazwa,{dane[0],dane[1],dane[2]},symbol,wartosc,{nazwaD,wartoscD}};
a.push_back(x);
}
}
else
{
cout << "Błąd otwarcia pliku" << endl;
}
}
Jeżeli dane były modyfikowane, przed zamknięciem aplikacji zapisujemy dane do pliku.
void ZapiszDaneDoPliku(vector<DuzyObiekt> &a, string sciezka){
ofstream plik(sciezka, ios::out | ios::trunc);
if(plik.is_open())
{
for(int i=0;i<a.size();i++){
plik<<a[i].nazwa<<endl;
plik<<a[i].DaneToString()<<endl;
plik<<a[i].symbol<<endl;
plik<<a[i].wartosc<<endl;
plik<<a[i].dodatek.nazwa<<endl;
plik<<a[i].dodatek.wartosc<<endl;
plik<<endl;
}
}
else
{
cout << "Nie można otworzyć pliku!" << endl;
}
}
Metoda DaneToString może mieć następującą postać.
string DuzyObiekt::DaneToString(){
ostringstream strumien;
for(int i=0;i<MAX;i++) {
strumien<<dane[i]<<" ";
}
return strumien.str();
}

Podobne dokumenty