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(); }