Prenesite si datoteko students.csv v kateri se nahaja seznam študentov. V datoteki je v vsaki posamezni vrstici zapisan študent v obliki id,name,surname,dateOfBirth,street,post,country. Datum je zapisan v formatu day.month.year.
Primer ene vrstice:
100432031,Simon,Novak,3.4.2001,Partizanska cesta 1,1000 Ljubljana,Slovenija
Napišite razred Address, ki ima:
instančne spremenljivke street, post, country in vse naj bodo tipa string
konstruktor s 3 parametri (za vsako instančno spremenljivko)
metodo toString
Uporabite razred Date iz predhodnih nalog. Razred naj ima:
instančne spremenljivke day, month, year in vse naj bodo tipa int
konstruktor s tremi paramteri (za vsako instančno spremenljivko)
metode get za vsako instančno spremenljivko
metodo toString ter dodatno:
razredo metodo (static) GetDateFromString, ki kot edini parameter prejme datum v obliki niza in ga vrne kot Date. V metodi prožite/vržite (throw) izjemo (UnparseableDateException), če podan niz, ki vsebuje datum, ni v pravem formatu. Izjemo npr. prožite, če datum ne vsebuje točno dve piki in če je namesto številke zapisana črka.
Napišite razred Student, ki ima:
instančne spremenljivke id (unsigned int), name (string), surname (string), dateOfBirth (Date), address (Address)
konstruktor s 4 parametri (za vsako instančno spremenljivko)
metodo toString
razredno (static) metodo std::vector<std::shared_ptr<Student>> LoadFromFile(const std::string &filename), ki iz datoteke prebere seznam študentov, jih shrani v vektor in le-tega vrne. Pri branju posameznega študenta iz datoteke v primeru napačnega formata datuma ulovite izjemo UnparseableDateException (try - catch blok)
razredno (static) metodo void SaveToFile(const std::vector<std::shared_ptr<Student>> &students, const std::string &fileName), ki v datoteko zapiše prejeti seznam študentov. Pri tem zapišite v formatu, da boste lahko z LoadFromFile prebrali.
Napišite izjemo (razred) UnparseableDateException, ki naj deduje iz sistemskega razreda std::exception. Potrebno je povoziti (angl. override) metodo const char* what() const noexcept iz nadrazreda exception. Razredu UnparseableDateException dodajte še lastnost std::string message in konstruktor, ki kot parameter prejme (napačen) datum v obliki niza in v spremenljivko message shranimo npr. niz Unparseable date: "21.5a.2020".
Pomagajte si z naslednjo povezavo: http://www.cplusplus.com/doc/tutorial/exceptions/.
V glavnem programu najprej iz datoteke preberite študente in vektor s študenti izpišite v konzolo.
V nalogi uporabljate pametne kazalce za ustvarjanje objektov shared_ptr iz standarda C++11. (https://en.cppreference.com/w/cpp/memory/shared_ptr)
Pomoč za delo z datotekami: Za delo z datotekami si pomagajte z naslednjo povezavo: http://www.cplusplus.com/doc/tutorial/files/. Glede na to, da so podatki shranjeni v csv (angl. comma-separated values) formatu, si lahko pomagate z metodo getline(istream &is, string &str, char delim), kjer parameter is predstavlja objekt istream, iz katerega preberemo podatke, parameter str je spremenljivka, v katero se shrani prebran niz in parameter delim predstavlja ločilo, do katerega bo (trenutni) niz prebran. V vašem primeru bo prvi parameter predstavljal vhodno datoteko, drugi parameter bo spremenljivka, v katero boste shranili prebrano vrednost, tretja vrednost pa bo znak vejica (,).
students.csv