[ Pobierz całość w formacie PDF ]
wykorzystamy plik elementowy typu file of record.
procedure ZapiszNaDysku(NazwaPliku : string);
var
f : file of Ksiazka;
i : integer;
begin
rewrite(f); { otwórz (utwórz) plik }
for i := 1 to LbPoz do { zapisz kolejne rekordy }
write(f, Katalog[i]);
close(f); { zamknij plik }
end;
106 Turbo Pascal programowanie
Powyższa procedura ilustruje typową metodę zapisywania w pliku zawartości bazy
danych. Po skojarzeniu pliku z odpowiednią zmienną i otwarciu go zapisujemy kolejne
rekordy znajdujące się w tablicy (zwróć uwagę, że rekordy zapisywane są w całości,
a nie polami). Po zapisaniu właściwej liczby rekordów zamykamy plik... i to wszystko.
Musisz jeszcze zdawać sobie sprawę, że każde otwarcie będzie powodowało utratę
poprzedniej zawartości pliku (rewrite!), ale ponieważ przed chwilą niejawnie
założyliśmy, że każdorazowo zapisujemy cały katalog, jest to do przyjęcia.
Odczytanie zawartości katalogu z pliku przebiega według nieco innego schematu.
Ponieważ nie wiemy, ile rekordów mamy właściwie odczytać, nie możemy zastosować
pętli for. Najpopularniejszym rozwiązaniem jest czytanie kolejnych rekordów do
momentu napotkania końca pliku, co wykrywane jest przez procedurę eof (ang. end-of-
file koniec pliku). Jak nietrudno się domyślić, tym razem zastosujemy pętlę while
(lub repeat):
procedure OdczytajZDysku(NazwaPliku : string);
var
f : file of Ksiazka;
i : integer;
begin
i := 0; { wyzeruj licznik rekordów }
while not eof(f) do
begin
Inc(i); { kolejny rekord }
read(f, Katalog[i]);
end;
LbPoz := i; { wczytano tyle rekordów }
close(f);
end;
Pozostałe operacje wykonywane w procedurze są praktycznie takie same, jedynie do
otwarcia pliku wykorzystujemy tym razem procedurę reset. Zauważ, że konstrukcja
procedur ZapiszNaDysku i OdczytajZDysku przewiduje przekazanie nazwy pliku
jako parametru, co z kolei pozwala na ich użycie bez konieczności każdorazowego
komunikowania się z użytkownikiem (nazwę można zaszyć w programie jako stałą).
Jednym z możliwych (i często stosowanych) rozwiązań kwestii zapamiętywania danych
jest każdorazowe zapisywanie całej bazy w chwili zakończenia programu i odczyty-
wanie jej zaraz po uruchomieniu. W tym celu wystarczy na początku części operacyjnej
(przed wywołaniem menu) wstawić instrukcję
OdczytajZDysku(PLIK_KATALOGU);
zaś przed samym końcem programu dopisać
ZapiszNaDysku(PLIK_KATALOGU);
przy czym stałą PLIK_KATALOGU należy wcześniej zdefiniować jako np.
PLIK_KATALOGU = 'Katalog.dat'
Pliki, czyli jak uchronić dane przed zgubą 107
Metoda ta pozwala na każdorazowe zapamiętywanie treści katalogu po zakończeniu
programu i jej odtwarzanie na początku kolejnej sesji bez konieczności podawania
nazwy pliku (uwaga: przed pierwszym uruchomieniem programu musisz utworzyć
pusty plik o nazwie KATALOG.DAT, w przeciwnym przypadku próba otwarcia nie
powiedzie się). Innym sposobem jest uzupełnienie menu o polecenia zapisu i odczytu
danych, co jednak wiąże się z koniecznością wywoływania odpowiednich poleceń. Jeśli
wreszcie chcesz dać użytkownikowi możliwość zmiany nazwy pliku z danymi, musisz
uzupełnić program o odpowiednie instrukcje wczytujące ją z klawiatury.
Do przechowywania danych można również wykorzystać plik tekstowy, jednak ope-
racje odczytu i zapisu będą nieco bardziej skomplikowane. Wymiana danych z plikiem
tekstowym odbywa się tak samo, jak z monitorem i klawiaturą, a więc poszczególne
pola rekordów należy zapisywać i odczytywać indywidualnie. W zamian za to uzysku-
jemy możliwość łatwego obejrzenia treści pliku (gdyż zawiera on wyłącznie tekst),
a także skierowania (lub odczytania) danych do (z) jednego ze standardowych urządzeń
wyjścia (wejścia) obsługiwanych przez system operacyjny (np. drukarki). Oto przykład
procedury zapisującej katalog do pliku tekstowego (operację odczytu możesz zreali-
zować w ramach ćwiczeń):
procedure ZapiszNaDysku(NazwaPliku : string);
var
f : text; { tym razem plik tekstowy }
i : integer;
begin
rewrite(f); { utwórz plik }
for i := 1 to LbPoz do { zapisz kolejne rekordy }
with Katalog[i] do
begin
writeln(f, 'Pozycja katalogu: ', i);
writeln(f, 'Tytul: ', Tytul);
writeln(f, 'Autor: ', Autor);
if Wypozyczajacy = '' then
writeln(f, 'Ksiazka znajduje sie na polce.')
else
writeln(f, 'Wypozyczajacy: ', Wypozyczajacy);
writeln(f);
end;
close(f); { zamknij plik }
end;
Sposób zapisania treści rekordu do pliku przypomina procedurę WypiszDane (zobacz
poprzedni rozdział), z tym, że każda instrukcja write(ln) uzupełniona jest o specyfi-
kację zmiennej plikowej, np.
writeln(f, 'Autor: ', Autor);
108 Turbo Pascal programowanie
Odczytywanie danych z plików tekstowych nastręcza nieco więcej kłopotów, zwłaszcza
gdy plik zawiera informacje mieszanych typów (tekst i liczby). Ceną za luzny format
zapisu jest najczęściej konieczność tworzenia skomplikowanych procedur realizujących
konwersje typów i sprawdzanie poprawności danych.
Na szczęście pliki tekstowe posiadają również zalety (jedną z nich jest właśnie czytelny
format). Ponieważ standardowe urządzenia wyjściowe są w systemie DOS obsługiwane
[ Pobierz całość w formacie PDF ]