Baza Danych

1. Zawartość pliku (bazy danych)
Na plik zawierający bazę danych składa się n, 0<n<100 wierszy zawierający informację o n różnych produktach spożywczych. Każdy wiersz podzielony jest na 6 kolumn o szerokości odpowiednio 5, 20, 8, 8, 8, 8 znaków. W kolumnach znajdują się informacje o produktach. Kolumna 1 (o szerokości 5 znaków) zawiera numer wiersza. Kolumna 2 (o szerokości 20 znaków) zawiera nazwę produktu. Pozostałe kolumny zawierają odpowiednio informację na temat ilości produktu (liczba rzeczywista), jednostki miary (litr, kilogram, sztuka, etc.), ceny jednostkowej (liczba rzeczywista) oraz ceny całkowitej (liczba rzeczywista - iloczyn ceny jednostkowej i ilości produktu). 

Ważne jest również formatowanie zawartości poszczególnych kolumn. Zawartość kolumn 1-4 ma być wyrównana do lewej, zawartość kolumn 5-6 do prawej. 

Wszystkie liczby rzeczywiste w bazie danych mają być zapisane z precyzją dokładnie dwóch miejsc po przecinku. 

Przykładowa zawartość pliku z bazą danych:
1    chleb               2.00    sztuka      1.60    3.20
2    maslo               0.50    kg          3.00    1.50

Należy zauważyć, że każdy wiersz ma stałą długość. Na końcu każdego wiersza znajdują się dwa znaki białe CR (carriage return) oraz LF (line feed).

2. Omówienie programu:
a. Po uruchomieniu programu użytkownik pytany jest o ścieżkę dostępu i nazwę pliku z bazą danych (omawianą w punkcie 1)
b. Jeśli podany plik nie istnieje - użytkownik ma być zapytany o możliwość utworzenia pliku (w przypadku podjęcia decyzji o nieutworzeniu pliku - program zakończy działanie)
c. Następnie ma się wyświetlić menu zawierający pozycje:
1 Wyświetl całą bazę danych
2 Wyszukaj element
3 Dodaj element
4 Usuń element
5 Modyfikuj element
0 Zakończ działanie programu
d. Po wybraniu pozycji 1 wyświetlana jest zawartość całej bazy danych (lub stosowna informacja, gdy baza jest pusta)
e. Po wybraniu pozycji 2 użytkownik podaje albo numer wiersza bazy danych albo nazwę produktu, który następnie ma być wyszukany i wyświetlony na ekranie
f. Po wybraniu pozycji 3 użytkownik jest pytany o nazwę produktu, ilość, jednostkę miary i cenę jednostkową produktu, po czym, jeśli w bazie danych nie ma wprowadzonego produktu, produkt jest dodawany (na koniec pliku) do bazy danych. W przeciwnym przypadku modyfikowany jest wiersz bazy danych, zawierający starą informację o produkcie.
g. Po wybraniu pozycji 4 użytkownik podaje albo numer wiersza bazy danych albo nazwę produktu do usunięcia
h. Po wybraniu pozycji 5 użytkownik podaje albo numer wiersza bazy danych albo nazwę produktu do zmodyfikowania. Jeśli wskazany produkt nie istnieje, program wyśiwetli stosowną informację nie modyfikując bazy danych. W przeciwnym przypadku użytkownik pytany jest o nazwę, ilość, jednostkę miary i cenę jednostkową produktu, po czym modyfikowana jest odpowiednia linia bazy danych.
i. Po wybraniu pozycji 0 program zakończy działanie

3. Uwagi:
a. Program będzie zrealizowany obiektowo. Sugeruje się utworzenie klasy produkt oraz klasy baza_danych, przeciążenie operatorów << (istream &, produkt & ), >> (ostream &, produkt &), << (ifstream &, produkt & ), >> (ofstream &, produkt &), etc.
b. Wszystkie informacje na ekranie mają być wyświetlane w formacie identycznym (szerokość kolumn, formatowanie, precyzja liczb rzeczywistych, etc.) jak w pliku z bazą danych.
c. Wszelkich operacji na pliku oraz standardowym strumieniu wyjściowym (wybór wyrównania, szerokości pola, precyzji liczb float, etc.) należy dokonywać za pomocą funkcji klasy ios.
d. Wszelkie operacje na bazie danych powinny odbywać się bezpośrednio na pliku. Wczytywanie całego pliku do pamięci jest niedopuszczalne.
e. Plik z bazą danych powinien być otwierany bezpośrednio przed dokonaniem operacji we/wy i zamykany bezpośrednio po zakończeniu operacji we/wy. 
f. W trakcie przeszukiwania/modyfikacji/odczytu/zapisu pliku należy pozycjonować wskaźnik do odczytu/zapisu za pomocą funkcji seekg(), seekp(). 

