[ Pobierz całość w formacie PDF ]
operatorską), wystarczy następujące wywołanie:
ZapiszNaDysku('con');
zaś aby wydrukować katalog na drukarce, musisz użyć wywołania
ZapiszNaDysku('prn');
gdzie con i prn są nazwami systemowych urządzeń wyjścia (konsoli i drukarki).
Na koniec wrócimy na chwilę do plików elementowych, by powiedzieć kilka słów
o metodach realizowania swobodnego dostępu do danych. Bieżący element pliku (tj.
element, którego dotyczyła będzie kolejna instrukcja read lub write) wskazywany jest
przez wspomniany już wskaznik plikowy. Wywołanie
Seek(zmienna-plikowa, numer-elementu)
powoduje ustawienie wskaznika plikowego tak, by kolejna operacja odczytu lub zapisu
rozpoczęła się od elementu danego numerem-elementu (elementy numerowane są od
zera). Dodatkowymi funkcjami wykorzystywanymi podczas manipulowania wskazni-
kiem plikowym są FilePos, zwracająca jego bieżącą wartość, oraz FileSize, zwraca-
jąca rozmiar pliku. Tak więc zakładając, że f jest plikiem typu file of integer
wywołanie
Seek(f, FileSize(f));
ustawi wskaznik plikowy za ostatnim elementem pliku (czyli przygotuje plik do dopisy-
wania), zaś konstrukcja
for i := 1 to 10 do
begin
Seek(f, random(FileSize(f));
read(f, i);
writeln(i);
end;
odczyta z pliku dziesięć losowo wybranych liczb (funkcja random(k) zwraca liczbę
pseudoprzypadkową z zakresu od zera do k) i wyświetli je na ekranie.
Swobodny dostęp do danych, chociaż bardzo przydatny, nie powinien być nadużywany.
Wszelkie operacje na plikach są znacznie bardziej czasochłonne, niż operacje na danych
umieszczonych w pamięci, zaś operacje w trybie sekwencyjnym są znacznie szybsze,
niż w trybie dostępu swobodnego. Niezależnie od tych uwag musisz pamiętać, że
wszelkie manipulacje na zawartości plików wiążą się z ryzykiem utraty danych w przy-
padku awarii systemu (np. wyłączenia zasilania). Dlatego też pliki należy zamykać
bezpośrednio po wykonaniu niezbędnych czynności.
Pliki, czyli jak uchronić dane przed zgubą 109
Zapamiętaj
" Do trwałego przechowywania informacji w systemie komputerowym służą pliki.
" Turbo Pascal umożliwia obsługę plików elementowych, tekstowych oraz amor-
ficznych.
" Pliki elementowe składają się z elementów tego samego typu (prostego lub
strukturalnego). Liczba elementów jest zawsze całkowita.
" Pliki tekstowe zawierają dane reprezentowane w postaci wierszy tekstu. Można
ich używać do przechowywania danych różnych typów.
" Pliki elementowe umożliwiają dostęp swobodny, natomiast pliki tekstowe
pozwalają wyłącznie na dostęp sekwencyjny.
" Plik reprezentowany jest w programie przez zmienną plikową, którą należy
skojarzyć z fizycznym plikiem za pomocą procedury assign.
" Operacje na zawartości pliku muszą być poprzedzone jego otwarciem (reset
lub rewrite) i zakończone zamknięciem (close).
" Swobodny dostęp do elementów pliku umożliwia procedura Seek, ustawiająca
wskaznik plikowy na zadanej pozycji.
" Mechanizmy obsługi plików tekstowych umożliwiają przesyłanie danych nie
tylko na dysk, lecz również z i do standardowych urządzeń wejścia-wyjścia
systemu operacyjnego.
110 Turbo Pascal programowanie
Aańcuchy
Dane tekstowe mają obok grafiki największy udział w objętości informacji
przetwarzanej i przechowywanej we współczesnych systemach komputerowych. Z tego
też względu każdy szanujący się język wysokiego poziomu jest wyposażony w mecha-
nizmy pozwalające na reprezentowanie, przechowywanie i przetwarzanie tekstów.
W Turbo Pascalu służy do tego typ łańcuchowy (string), którym zajmiemy się w tym
rozdziale. Dowolny tekst (łańcuch, ang. string) przechowywany jest w programie
w postaci ciągu znaków, który może być interpretowany jako specyficzna tablica
array[0..255] of char
Przykładowa deklaracja zmiennej łańcuchowej ma postać
var
Napis : string;
Stałe łańcuchowe zapisuje się natomiast w postaci ciągów znaków ujętych w apostrofy
(podobnie jak stałe znakowe):
const
STALY_NAPIS = 'Turbo Pascal';
Zerowy element łańcucha przechowuje jego aktualną długość (tzw. długość dyna-
miczną); będąc typu znakowego może on przyjmować wartości od 0 do 255. Stąd
właśnie wynika ograniczenie długości łańcucha do 255 znaków, co zresztą w
większości przypadków wystarcza aż nadto. Aby skrócić łańcuch (dana typu string
zajmuje zawsze 256 bajtów, niezależnie od rzeczywistej długości tekstu), można
wykorzystać deklarację
nazwa-zmiennej : string
Możliwość ta jest szczególnie cenna, jeśli w programie wykorzystujesz np. tablicę
łańcuchów: deklarując element składowy tablicy jako string[20] oszczędzasz 235
bajtów, co przy stu elementach daje zysk ponad 20 kB. Warto zauważyć, że próba
zapisania do skróconego łańcucha tekstu dłuższego niż pozwala deklaracja nie
spowoduje błędu, a jedynie obcięcie nadmiarowych znaków.
Aańcuchy 111
Operacje na łańcuchach w zasadzie nie różnią się zapisem od operacji na zmiennych
typu prostego i nie wymagają stosowania żadnych specjalnych sztuczek. Do wprowa-
dzania, wyprowadzania i przypisywania łańcuchów wykorzystuje się podobnie jak
dla zmiennych typów prostych procedury read(ln), write(ln) oraz operator
przypisania. Również porównanie dwóch łańcuchów zapisywane jest identycznie, przy
czym wewnętrznie odbywa się ono przez porównanie kodów odpowiadających sobie
znaków. Tak więc:
'C'
'c' > 'Pascal' (kod ASCII znaku 'c' jest większy od kodu 'P')
'C' > '' (dowolny łańcuch jest większy od łańcucha pustego)
Z rzeczy prostych pozostało jeszcze dodawanie łańcuchów, polegające na ich zwykłym
sklejaniu (niestety, łańcuchów nie da się odejmować, mnożyć ani dzielić). Jeżeli
zmienna lancuch1 zawiera tekst 'Turbo', zaś lancuch2 tekst 'Pascal', to
wynikiem sklejenia obu zmiennych:
wynik := lancuch1 + lancuch2;
będzie oczywiście tekst 'TurboPascal'.
Również odwołania do poszczególnych znaków łańcucha realizuje się w sposób ele-
mentarny. Ponieważ może on być traktowany jako tablica znaków, instrukcja
s[5] := 'x'
wstawi znak x na piątą pozycję w łańcuchu s.
Bardziej wymyślne operacje na łańcuchach wymagają użycia specjalnie do tego celu
przeznaczonych funkcji, z których najważniejsze opisano poniżej:
Length(s) zwraca bieżącą długość łańcucha s;
Concat(s1, s2) skleja łańcuchy s1 i s2 (podobnie, jak operator +)
Copy(s, m, n) zwraca podłańcuch o długości m znaków wycięty z łań-
cucha s poczynając od pozycji n;
Pos(ch, s) zwraca numer pozycji, na której w łańcuchu s znajduje
[ Pobierz całość w formacie PDF ]