Typy plikowe. 1. Wprowadzenie. 2. Podstawowe operacje na plikach. Przetwarzanie plików w języku Pascal 1



Podobne dokumenty
OPERACJE NA PLIKACH. Podstawowe pojęcia:

Wykład PASCAL - Pliki tekstowe

Pliki. Operacje na plikach w Pascalu

Język programowania PASCAL

Wszystkie zmienne typu plikowego, z wyjątkiem Output i Input muszą być zadeklarowane w sekcji deklaracji programu, który z nich korzysta.

Podstawy programowania

Pliki. Ze względu na typ zawartych w nich danych rozróżnia się trzy podstawowe rodzaje plików:

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

PASCAL Kompendium. Środowisko TURBO PASCAL Skróty klawiaturowe. Edycja kodu Pomoc spis treści. Skopiowanie zaznaczonego bloku do schowka

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

PLIKI TEKSTOWE F C E 30 0D 0A 42 6F 72 6C 61 6E 64 1A T U R B O _ P A S C A L _ 7. 0

Ćwiczenie 2 Wczytywanie i zapisywanie do plików tekstowych

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Programowanie w Turbo Pascal

Pascal. 1. Pliki tekstowe. Przykład 1.1. Zapis do pliku tekstowego

Podstawy programowania

Informatyka 1. Przetwarzanie tekstów

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

PLIKI. Składnia deklaracji zmiennej plikowej: file of <typ>

Kompendium wiedzy z Pascala

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Programowanie w języku Python. Grażyna Koba

Podstawy programowania w języku C++

Lekcja 6: Pascal. Procedura i funkcja

Podstawy Programowania C++

WIADOMOŚCI WSTĘPNE WPROWADZENIE DO JĘZYKA TURBO PASCAL. Klawisze skrótów. {to jest właśnie komentarz, moŝna tu umieścić dowolny opis}

Wprowadzenie Tablica jednowymiarowa Tablice wielowymiarowe Algorytmy Rekordy Pliki Zadania Bibliografia

Podstawy programowania

Pascal - wprowadzenie

Wykład 4. Tablice. Pliki

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja cz. 1

Wstęp do programowania. Różne różności

Podstawy programowania skrót z wykładów:

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

P R OGRA M OW A N I E KOMPUTERÓW Ćwiczenia laboratoryjne

Kilka prostych programów

Podstawy programowania

2.Sprawdzanie czy podana liczba naturalna jest pierwsza Liczba pierwsza to liczba podzielna tylko przez 1 i przez siebie.

Instrukcja standardowa Writeln

Wprowadzenie komentarzy do programu

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Delphi Laboratorium 3

Zasady Programowania Strukturalnego

Podstawy programowania

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Biblioteka standardowa - operacje wejścia/wyjścia

Ćwiczenie: JavaScript Cookies (3x45 minut)

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku

Podstawy programowania w języku C++

Programowanie w językach

1 Podstawy c++ w pigułce.

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Polecenia wewnętrzne:

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Podstawy programowania

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Podstawy programowania

Języki programowania obiektowego Nieobiektowe elementy języka C++

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Instrukcja użytkownika

Zasady programowania Dokumentacja

typ zakres sposob zapamietania shortint integer bajty (z bitem znaku) longint byte word

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Funkcje zawarte w bibliotece < io.h >

Pliki wykład 2. Dorota Pylak

Informatyka 1. Wyrażenia i instrukcje cd., ręczna symulacja, operacje wejścia/wyjścia

Podstawy Programowania Podstawowa składnia języka C++

Wstęp do programowania

Obsługa klawiszy specjalnych

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

Programowanie w językach wysokiego poziomu

Język ludzki kod maszynowy

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Algorytmy i struktury danych

I. Interfejs użytkownika.

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

Algorytm. a programowanie -

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

1 Podstawy c++ w pigułce.

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

Krótki kurs obsługi środowiska programistycznego Turbo Pascal z 12 Opracował Jan T. Biernat. Wstęp

Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe

Bloki anonimowe w PL/SQL

Programowanie strukturalne

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Funkcje zawarte w bibliotece < io.h >

Transkrypt:

Przetwarzanie plików w języku Pascal 1 Typy plikowe 1. Wprowadzenie Jednym z typów złożonych języka Pascal jest typ plikowy. Zmienne typu plikowego stanowią programową reprezentację plików zewnętrznych. Pod pojęciem pliku rozumieć będziemy złożoną strukturę danych języka Pascal, natomiast mianem pliku zewnętrznego określać będziemy fizyczny plik danych umieszczony na takim nośniku masowym jak dysk, dyskietka, taśma magnetyczna itp. Pojęcie pliku pozwala abstrachować od fizycznej organizacji pliku zewnętrznego oraz rodzaju nośnika. Plik jest ciągiem (sekwencją) elementów tego samego typu. Liczba elementów pliku nie jest z góry znana, zmieniać się może w trakcie wykonania programu w szerokich granicach. Ograniczenie maksymalnej ilości elementów w pliku ma charakter techniczny, zależy głównie od ilości wolnego miejsca na nośniku oraz specyfiki stosowanej organizacji struktur plikowych na poziomie systemu operacyjnego. W każdej chwili bezpośrednio dostępny jest tylko jeden element pliku, określony przez aktualną pozycją w pliku. Zinterpretować to można w ten sposób, że w danym momencie zawsze istnieje bieżący element pliku, wyróżniony przez specjalny wskażnik pozycji w pliku. Plik znajduje się w pozycji początkowej, jeżeli elementem bieżącym jest pierwszy element w pliku. Plik znajduje się w pozycji końcowej, jeżeli bieżącym elementem jest ostatni element pliku. Liczba elementów danego pliku jest zwana długością pliku. Plik o długości zerowej nazywany jest plikiem pustym. Składnia deklaracji typu plikowego ma następującą postać: typ_plikowy = File Of typ_składowy gdzie typ_składowy to dowolny typ prosty lub złożony, za wyjątkiem typu plikowego lub takiego typu złożonego, którego składową jest typ plikowy. Mimo, iż autor języka w pozycji [2] podaje przykład pliku wielopoziomowego, jednak w standardzie jak i realnych implementacjach języka Pascal mechanizm ten nie jest dostępny. Przykłady deklaracji plików: PlikLiczb = File Of Integer;{ Plik liczb całkowitych } PlikZnakow = File Of Char;{ Plik znaków } PlikTablic = File Of Array[ 1..12 ] Of Real; {Plik tablic rzeczywistych} W standardzie języka typy plikowe miały charakter czysto sekwencyjny, plik konstruuje się dołączając na końcu kolejne elementy, następnie zaś można go analizować stosując sekwencyjne przeglądanie. Implementacje języka firmy Borland (od Turbo Pascala 3.0 do Borland Pascala) umożliwiają również rozszerzenie możliwości o dostęp swobodny. W rozdziale tym pominięte zostaną klasyczne metody dostępu sekwencyjnego które znaleźć można we wspomnianej już pracy [2] oraz [1]. Rówież praca [3] zawiera systematyczny opis zarówno aspetków syntaktycznych jak i omówienie metod klasycznego przetwarzania sekwencyjnego. W pracy tej główny nacisk położony zostanie na praktycznie użyteczne metody wykorzystania plików z uwzględnieniem specyfiki języka Pascal w implementacjach firmy Borland. 2. Podstawowe operacje na plikach Pierwszym etapem pracy z plikami jest zadeklarowanie zmiennej plikowej. Odwolując się do poprzedniego przykładu można podać następujące definicje: DaneOZatrudnieninu : PlikLiczb; TekstOferty : PlikZnaków; BilansyMiesięczne : PlikTablic; lub wprowadzając opis typu bezpośrednio do definicji zmiennej: WskaznikiEkonomiczne : File Of Real; NotowaniaGiełdowe : File Of Array[ 1..IloscSpolek ] Of Real; Po definicji, zmienna plikowa jest reprezentantem typu plikowego, potocznie utożsamia się ją z plikiem. Nie reprezentuje ona jednak jeszcze żadnego pliku zewnętrznego. Zmienna plikowa kojarzona jest z plikiem zewnętrznym poprzez wywołanie procedury Assign. Deklaracje procedury ma następującą postać: Assign( var ZmiennaPlikowa; NazwaPlikuZewnętrznego : String );

Przetwarzanie plików w języku Pascal 2 Pierwszym parametrem procedury tej jest zmienna plikowa dowolnego typu plikowego. Drugim parametrem jest łańcuch znaków określający nazwę pliku zewnętrznego. Po wywołaniu procedury Assign a więc po skojarzeniu zmiennej plikowej z plikiem zewnętrznym, każda operacja na zmiennej plikowej powoduje odpowiednie działanie na pliku zewnętrznym. Wymaga się, aby zmienna plikowa nie reprezentowała już otwartego pliku. Skojarzenie pomiędzy zmienną plikową a plikiem zewnętrznym trwa tak długo, aż nie zostanie dokonane skojarzenie tej zmiennej plikowej z innym plikiem. Po realizacji skojarzenia zmiennej plikowej z plikiem zewnętrznym nie jest on jeszcze dostępny do zapisu czy odczytu. Należy dokonać otwarcia tego pliku. Do otwarcia służą procedury Reset, Rewrite, Append, ta ostatnia zostanie omówiona we fragmencie poświęconym plikom tekstowym. Procedura Reset sluży do otwarcia pliku istniejącego. W przypadku gdy plik nie istnieje powstaje błąd, który może objawić się w dwojaki sposób. W przypadku gdy dyrektywa przełączająca I jest włączona {$I+} wygenerowany zostanie błąd wykonania programu, powodujący jego zakończenie. W przypadku, gdy dyrektywa I jest wyłączona {$I-}, program nie jest przerywany a kontrola poprawności otwarcia spoczywa na programiście (bliższe informacje w dalszej części pracy). Po poprawnie zakończonym wykonaniu procedury Reset, plik jest ustawiany w pozycji początkowej. Procedura Rewrite służy do otwarcia pliku, przy czym staje się on plikiem pustym. Oznacza to, że gdy plik zewnętrzny istnieje to jego poprzednia zawartosć jest kasowana. Gdy plik nie istnieje, jest tworzony nowy, pusty plik. Poza tym inne informacje dotyczące procedury Reset mają zastosowanie w przypadku procedury Rewrite. Zarówno procedura Reset jak i Rewrite otrzymuja jako parametr zmienną plikową. W pewnych przypadkach wystąpić może drugi parametr, którego znaczenie zostanie omówione szczególowo we fragmencie poświęconym plikom amorficznym. Po pomyślnym otwarciu pliku można już wykonywać na nim operacje zapisu i odczytu. Zapis do pliku elementowanego jest realizowany przez procedurę Write, a odczyt przez procedure Read. Procesowi zapisu i odczytu podlegają zmienne zgodne w sensie przypisania z typem składowym pliku. Zawsze pierwszym parametrem wywołania obu procedur jest zmienna plikowa otwartego pliku. Zapis liczb 10, 20, 30 do pliku liczby.dat realizuje następujący fragment programu. Program P1; Liczby : File Of Integer; Assign( Liczby, liczby.dat ); Rewrite( Liczby ); Write( Liczby, 10 ); Write( Liczby, 20 ); Write( Liczby, 30 ); Close( Liczby ); End. Poniższy fragment ilustruje odczyt wcześniej zapisanych liczb (z wyświetleniem na ekranie ) - wyświetlone zostaną liczby 10 i 20: Program P2; Liczby : File Of Integer; L : Integer; Assign( Liczby, liczby.dat ); Reset( Liczby ); Read( Liczby, L ); WriteLn( L ); Read( Liczby, L ); WriteLn( L ); Close( Liczby ); End. Po realizacji planowanych operacji na pliku, wtedy gdy nie jest on już potrzebny, należy plik zamknąć. Realizuje to procedura Close, której wywołanie zawierają przedstawione wyżej programy. W trakcie jej wykonania następuje ostateczne zapisanie wszystkich informacji do pliku (oczekujących być może w buforach systemowych).

Przetwarzanie plików w języku Pascal 3 Typowe sekwencyjne przetwarzanie pliku ilustruje program P3. Zadaniem programu jest wyświetlenie na ekranie monitora zawartości pliku, którego elementy są typu Integer. Program P3; Liczby : File Of Integer; L : Integer; Assign( Liczby, liczby.dat ); Reset( Liczby ); { Dopóki nie osiągnięto końca pliku } While Not Eof( Liczby ) Do Read( Liczby, L ); { Czytaj liczbą z pliku } WriteLn( L ); { Wyświetl liczbę na ekranie } Close( Liczby ); End. Program otwiera plik liczby.dat, po uprzednim skojarzeniu go ze zmienną plikową Liczby. Plik znajduje się w pozycji poczatkowej. Iteracja While umożliwia odczytanie wszystkich elementów zapisanych w pliku i wyświetlenie ich na ekranie. Zakończenie iteracji gwarantuje warunek Not Eof( Plik ). W warunku tym występuje wywołanie funkcji Eof, umożliwiającej testowanie, czy w wyniku ostatniej operacji przeprowadzonej na pliku, nie osiągnięto pozycji końcowej. Rezultatem Funkcji Eof jest wartość True jeżeli został osiągnięty koniec pliku, natomiast wartość False w przeciwnym wypadku. Przetwarzanie pliku elementowego ilustruje program przykładowy nr 1 umieszczony na końcu rozdziału. Realizuje on ewidencję danych adresowych zapamiętywanych w pliku rekordów. 3. Rodzaje typów plikowych Oprócz omówionych wcześniej plików elementowych, dostępne są jeszcze: predefiniowany typ plik tekstowy Text oraz charakterystyczne dla implementacji Borlanda pliki amorficzne. 3.1 Pliki tekstowe Typ Text jest predefinowanym standardowym typem języka Pascal. Służy on do reprezentowania plików tekstowych. Elementami takiego pliku są wiersze tekstu będące ciągami znaków zakończonymi znacznikiem końca linii - najczęściej parą znaków Cr-Lf (tzw. powrót karetki i nowy wiersz ). Dla plików tekstowych zdefinowano dodatkowe procedury. Załóżmy, że dana jest następująca definicja: PlikTekstowy : Text; LiniaTekstu : String; Na takim pliku określone są operacje realizowane przez procedury: WriteLn( PlikTekstowy ) - dołącza znacznik końca wiersza do bieżącej linie w pliku PlikTekstowy. ReadLn( PlikTekstowy ) - powoduje pominięcie ciągu znaków w pliku PlikTekstowy aż do znaku występującego bezpośrednio po najbliższym znaczniku końca wiersza. EOLn( PlikTekstowy ) - funkcja o wartości logicznej, której rezultatem jest wartość True gdy aktualna pozycja pliku wskazuje na znacznik końca wiersza. Gdy tak nie jest, rezultatem jest wartość False. Wywołanie : Read( PlikTekstowy, LiniaTekstu); ReadLn( PlikTekstowy ); może być zastąpione wywołaniem: ReadLn( PlikTekstowy, LiniaTekstu ); Podobnie jest w przypadku procedur Write i WriteLn.

Przetwarzanie plików w języku Pascal 4 W przypadku plików tekstowych nieco inne znaczenie ma procedura Reset. Otwiera ona taki plik wyłącznie do odczytu. Procedura Rewrite natomiast otwiera plik tylko do zapisu. Dostępna jest również procedura Append otwierająca plik do dopisywania (w pozycji końcowej) w trybie tylko do zapisu. Program przykladowy nr 2 umieszczony na końcu rozdziału prezentuje w jaki sposób można wykorzystać pliki tekstowe do organizacji prostego programu narzędziowego wyświetlającego na ekranie zawartość pliku tekstowego. 3.2 Pliki amorficzne W wielu przypadkach trudno jest określić jakie mają być typy elementów pliku. Również bardzo często w plikach zewnętrznych składowana jest informacja tak zorganizowana, że trudno (bądź niemożna) zdefiniować typ plikowy, który umożliwiłby przetwarzanie takich plików. Typowym przykładem są pliki graficzne, dżwiękowe czy pliki baz danych integrujące w sobie nie tylko same dane a również informacje o ich organizacji i strukturze. W implementacjach języka Pascal firmy Borland dostępna jest możliwość przetwarzania plików o niezdefiniowanej strukturze wewnętrznej. Służy do tego typ File dla którego nie określa się typu składowego. Zakłada się jedynie, że na etapie otwarcia pliku określa się wyrażony w bajtach rozmiar bloku, takie właśnie bloki bądą mogły być z pliku czytane i doń zapisywane. Rozmiar bloku definiuje się na etapie otwierania plików za pośrednictwem procedur Reset i Rewrite, stanowi on drugi, opcjonalny parametr wywołania tych funkcji. W przypadku pominięcia rozmiaru bloku przyjmowany jest domyślnie rozmiar 128 bajtów. Górną granicą rozmiaru bloku jest 65535, czyli maksymalna wartość jaką można przedstawić przy użyciu typu Word, taki jest bowiem typ parametru określającego wielkość bloku (i taki jest maksymalny rozmiar segmentu danych). Dolne ograniczenie rozmiaru jest oczywiste-najmniejszy blok może mieć rozmiar jednego bajta. Ten przypadek jest szczególnie użyteczny, takie pliki są traktowane jak strumień bajtów, programista może swobodnie sterować strukturą zapisywanych informacji. Do realizacji zapisu i odczytu używa się procedur BlockWrite i BlockRead. Umożliwiają one zapis i odczyt pojedynczego bloku lub większej ich ilości. W szczególnym przypadku można jednym wywołaniem tych procedur zapisać lub odczytać cały (nieduży) plik. Procedury te otrzymują w postaci parametrów: 1. zmienną plikową typu File, 2. nazwę zmiennej stanowiącej bufor transferowy, 3. liczbę typu Word określającą ilość bloków, które mają zostać zapisane/odczytane, 4. opcjonalną zmienną typu Word określającą ile w rzeczywistości zapisano/odczytano bloków. Źródłem danych przy zapisie a miejscem gdzie będą umieszczone po odczycie, jest drugi parametr obu procedur. Wskazuje on miejsce w pamięci operacyjnej, wykorzystuje się tutaj wprowadzoną do implementacji firmy Borland możliwość przekazywania parametru przez zmienną bez konieczności specyfikowania typu. Z takim parametrem formalnym jest zgodny w sensie przypisania każdy parametr aktualny reprezentujący zmienną dowolnego typu. Zatem buforem transferowym może być np. pojedyncza zmienna typu Integer, dowolna tablica, rekord czy blok przydzielony dynamicznie na stercie programu. Rozmiar bufora transferowego musi być niemniejszy niż wynika to z przemnożenia rozmiaru bloku (określanego na etapie otwarcia plików) z trzecim parametrem określającym ilość bloków jakie maja być zapisane/odczytane. Należy tutaj zwrócić uwagę, że niedotrzymanie warunku nałożonego na rozmiar bufora transferowego może być grożne w skutkach. O ile przekazanie bufora o rozmiarze zbyt dużym jest zwykle jedynie marnotrawstwem pamięci o tyle bufor o rozmiarze zbyt małym jest niebezpieczny dla stabilności programu. Sumaryczna ilość danych (liczona w bajtach) do zapisu/odczytu przez omawiane funkcje wynika z przemnożenia rozmiaru bloku przez ilość bloków. Jeżeli jest ona większa niż rozmiar bufora transferowego, do pliku trafiają przypadkowe dane zapisane w pamięci operacyjnej tuż za końcem przekazanego bufora. Dużo groźniejsze następstwa ma zwykle odczyt danych do zbyt małego bufora, dodatkowe dane zostaną zapisane tuż za jego końcem, niszcząc umieszczoną tam zawartość pamięci operacyjnej, często zawierającej inne zmienne. Umieszczone niżej program prezentuje sposób wykorzystania procedur BlockRead i BlockWrite. Procedura ZapiszDane zapisuje do pliku dane.dat zawartość zmiennych typu Integer, Real, oraz tablicy łańcuchów znakowych. Procedura CzytajDane realizuje odczyt wcześniej zapisanych danych. Program P4; Dane : File; LiczbaInt : Integer; LiczbaReal : Real; Tablica : Array[ 1.. 3 ] Of String[ 20 ]; Ile : Word;

Przetwarzanie plików w języku Pascal 5 Procedure ZapiszDane; { Przygotowanie danych do zapisu } LiczbaInt := 10; LiczbaReal := 111.111; Tablica[ 1 ] := 'Pierwszy'; Tablica[ 2 ] := 'Drugi'; Tablica[ 3 ] := 'Trzeci'; Assign( Dane, 'dane.dat' ); { Otwarcie pliku z blokiem jednobajtowym } Rewrite( Dane, 1 ); { Zapis bloku o rozmiarze zmiennej Integer } BlockWrite( Dane, LiczbaInt, SizeOf( LiczbaInt ), Ile ); WriteLn('Zapisano ', Ile, ' bajtów dla Zmiennej LiczbaInt' ); { Zapis bloku o rozmiarze zmiennej Real } BlockWrite( Dane, LiczbaReal, SizeOf( LiczbaReal ), Ile ); WriteLn('Zapisano ',Ile, ' bajtów dla Zmiennej LiczbaReal' ); { Zapis bloku o rozmiarze zmiennej Tablica } BlockWrite( Dane, Tablica, SizeOf( Tablica ), Ile ); WriteLn('Zapisano ',Ile, ' bajtów dla Zmiennej Tablica' ); Close( Dane ); Procedure CzytajDane; { Wstępne zerowanie zmiennych globalnych } LiczbaInt := 0; LiczbaReal := 0; Tablica[ 1 ] := ''; Tablica[ 2 ] := ''; Tablica[ 3 ] := ''; Assign( Dane, 'dane.dat' ); { Otwarcie pliku z blokiem jednobajtowym } Reset( Dane, 1 ); { Odczt bloku o rozmiarze zmiennej Integer } BlockRead( Dane, LiczbaInt, SizeOf( LiczbaInt ), Ile ); WriteLn( 'Odczytano ', LiczbaInt ); { Odczt bloku o rozmiarze zmiennej Real } BlockRead ( Dane, LiczbaReal, SizeOf( LiczbaReal ), Ile ); WriteLn( 'Odczytano ', LiczbaReal ); { Odczt bloku o rozmiarze zmiennej Tablica } BlockRead ( Dane, Tablica, SizeOf( Tablica ), Ile ); WriteLn( 'Odczytano ', Tablica[ 1 ] ); WriteLn( 'Odczytano ', Tablica[ 2 ] ); WriteLn( 'Odczytano ', Tablica[ 3 ] ); Close( Dane ); ZapiszDane; CzytajDane; End. Program przykładowy nr 3 umieszczony na końcu rozdziału prezentuje sposób wykorzystania plików amorficznych do implementacji prostego programu narzędziowego realizującego kopiowanie plików zadanych parametrami wywołania programu.

Przetwarzanie plików w języku Pascal 6 4. Kontrola poprawności operacji dostępu do plików Operacje dostępu do plików zaliczane są do grupy operacji wejścia-wyjścia. W trakcie ich realizacji mogą wystąpić błędy, typowym przykładem jest próba otwarcia nieistniejącego pliku procedurą Reset, czy próba zapisu lub odczytu z pliku uprzednio nie otwartego. Domyślną reakcją na wystąpienie tego rodzaju błędów jest wystąpienie tzw. błędu wykonania programu powodującego jego awaryjne zakończenie z odpowiednim komunikatem w postaci: Runtime error num at ssss:oooo gdzie num to numer błędu wykonania a para ssss:oooo określa adres fragmentu kodu, który spowodował powstanie błędu. Taka strategia reakcji na błędy jest nie do przyjęcia w przypadku zastosowań praktycznych, w szczególnym przypadku komunikat w formie opisanej powyżej jest całkowicie nieczytelny dla typowego użytkownika komputerów. Implementacje języka Pascal firmy Borland umożliwiają przejęcie przez programistę kontroli poprawności wykonywanych operacji i realizację własnej strategii obsługi sytuacji błędnych. Aby uniknąć przymusowego zakończenia programu z błędem wykonania należy wykorzystać przełącznikową dyrektywę kompilatora I. Włączenie w kod programu dyrektywy{$i-} spowoduje, że błędy wejścia-wyjścia nie będą przerywaly wykonania programu. Dyrektywa w postaci {I+} powoduje włączenie kontroli poprawności wykonywanych operacji wejścia-wyjścia. We fragmentach kodu w którym kontrola jest wyłączona, programista jest zobowiązany do samodzielnej kontroli realizowanych operacji. W przeciwnym wypadku wystąpienie błędu spowodowować może nieprzewidywalne skutki. Do realizacji kontroli poprawności ostatnio wykonanej operacji służy funkcja IOResult. Jej rezultatem są wartości typu Integer. Wartość 0 oznacza brak błędu, inna wartość jest kodem błędu jaki został wykryty. Najczęściej spotykane błędy i ich interpretację zawiera tabela: Kod błędu Opis błędu 2 Plik nie został znaleziony 3 Nieprawidłowa scieżka 4 Zbyt wiele otwartych plików 5 Brak dostępu do pliku 6 Niewłaściwy identyfikator dostępu do pliku 12 Niewłaściwy tryb dostępu 15 Niewłaściwy numer stacji dysków 100 Błąd odczytu 101 Błąd zapisu 102 Plik nie skojarzony z plikiem zewnętrznym 103 Plik nie otwarty 104 Plik nie otwary do zapisu 105 Plik nie otwary do odczytu Tab. nr 1. Wybrane kody błędów wejścia-wyjścia Należy zwrócić uwagę na to, że funkcja IOResult działa w specyficzny sposób. Jej wywołanie po wystąpieniu błędu da w rezultacie jego kod. Jednak powtórne wywołanie funkcji (bez realizacji nastepnej operacji wejścia-wyjścia) IOResult da w rezultacie wartość 0, zatem jedynie pierwsze wywołanie po błędzie da wartość prawidłową. Jeżeli wartość kodu błędu jest dalej potrzebna (np. w celu wyświetlenia komunikatu o błędzie i jego przyczynie) wartość funkcji IOResult należy zapamiętac w zmiennej pomocniczej. Sposób wykorzystania dyrektywy I oraz funkcji IOResult prezentuje następujący przykład. Zalóżmy dla uproszczenia, że plik zewnętrzny dane.dat nie istnieje. Program P5; PlikPliczb : File Of Integer; Liczba : Integer; Assign( PlikLiczb, dane.dat ); Reset( PlikLiczb ); { Ponieważ procedura Reset wymaga istnienia pliku dane.dat, } { w trakcie jej wykonywania powstanie błąd wykonania } { a program zostanie przerwany }

Przetwarzanie plików w języku Pascal 7 Read( PlikLiczb, Liczba ); Close( PlikLiczb ); Program P6; PlikPliczb : File Of Integer; Liczba : Integer; Assign( PlikLiczb, dane.dat ); {$I+} {Wyłączenie kontroli błędów } Reset( PlikLiczb ); KodBledu = IOResult; {$I+} { Włączenie kontroli błędów } If KodBledu <> O Then WriteLn( Otwarcie pliku niemożliwe, kod błędu :, KodBledu ); Else Read( PlikLiczb, Liczba ); Close( PlikLiczb ); W programie P6 programista przejmuje kontrolę nad operacją otwarcia pliku. W przypadku gdy nie zakończyła się ona sukcesem, wyświetlany jest odpowiedni komunikat, którego formę definiuje programista, program nie jest przerywany, następuje jego normalne zakończenie, tak jak przewiduje aktualna ścieżka wykonania. Należy zwrócić uwagę na to, że zarówno wywołanie procedury Read jak i Close nie jest zabezpieczone przed przerwaniem z błędem wykonania. Podejście takie może się wydawać niekonsekwentnym. Jednak w zastosowaniach praktycznych najczęściej realizuje się wyspecjalizowaną kontrolę błędów w fragmentach najbardziej narażonych na ich powstanie, takich właśnie jak np. otwieranie czy tworzenie plików. Drobiazgowa kontrola poprawności wykonania każdej operacji wejścia-wyjścia znacznie powiększa program i obniżyć może jego efektywność. Wyważenie proporcji pomiędzy fragmentami skrupulatnie kontrolowanymi a takimi, co do których przewidujemy, że nie spowodują błędów jest trudne, a stosowane kryteria umowne i zależne od konkretnego zastosowania. 5. Informacje uzupełniające W procesie realizacji operacji na plikach bardzo użyteczne są dodatkowe procedury i funkcje dostępne w implementacjach języka Pascal firmy Borland. Oto ich zwięzły opis. Procedura Seek realizuje ustawianie odpowiedniej pozycji pliku. Pierwszy parametr to zmienna plikowa, drugi (typu LongInt) oznacza przesunięcie elementu bieżącego liczone względem początku pliku. Pierwszy element w pliku ma numer 0. Zatem wywołanie funkcji Seek dla dowolnej zmiennej plikowej Plik w postaci: Seek( Plik, 0 ) spowoduje ustalenie początkowej pozycji w pliku-elementem bieżącym jest pierwszy element. Procedura umożliwia niesekwencyjne przetwarzanie plików. Funkcji ne można stosować dla plików tekstowych. Funkcja FileSize umożliwia określenie ilości elementów danego pliku. Rezultat tej funkcji jest typu LongInt. Jeżeli plik jest pusty rezultat funkcji FileSize jest równy zero. Uwaga, wywołanie: Seek( Plik, FileSize( Plik ) - 1 ) umożliwia ustawienie się na ostatnim elemencie w pliku, natomiast wywołanie: Seek( Plik, FileSize( Plik ) ) umożliwia ustawienie się na końcu pliku. Funkcji nie można stosować dla plików tekstowych. Funkcja FilePos udostępnia bieżącą pozycję w pliku, określająca numer bieżącego elementu w pliku w stosunku do jego początku. Jeżeli bieżący element jest pierwszym w pliku, rezuktatem funkcji FilePos jest wartość 0. Jeżeli bieżaca pozycja pliku to jego koniec (tzn. rezultat funkcji Eof jest równy True), rezultat funkcji FilePos jest rówy rezultatowi funkcji FileSize. Funkcja nie może byc stosowana do plików tekstowych. Analiza programów przykładowych nr 2 i 3 wymaga znajomości metody przetwarzania parametrów wywołania programu. W implementacjach języka Turbo Pascal służą do tego funkcje ParamCount i ParamStr. Rezultatem pierwszej jest ilość parametrów wywołania programu. Wywołanie funkcji ParamStr( 1 ) udostępnia łańcuch znaków zawierający pierwszy

Przetwarzanie plików w języku Pascal 8 parametr wywołania programu, ParamStr( 2 ) drugi itd. Umieszczony niżej program wyświetla na ekranie wszystkie parametry z którymi został wywołany. Program P7; I : Integet; For I := 0 To ParamCount Do WriteLn ( Parametr nr:, I, to, ParamStr( I ) ); End. Zakładając, że program wykonywalny ma nazwę p7.exe, jego wywołanie z linii poleceń systemu DOS w postaci: p7 aa bb cc spowoduje wyświetlenie następujących wyników: Parametr nr: 1 to aa Parametr nr: 2 to bb Parametr nr: 3 to cc Szczegółwy opis prezentowanych w tym rozdziale procedur i funkcji oraz metod ich wykorzystania znaleźć można w pracach [4] i [5]; 6. Programy przykładowe Program przykładowy numer 1 Opis programu: Program prezentuje metody wykorzystywania plików elementowych do realizacji prostego programu spełniającego funkcje kartoteki adresowej. Program BazaDanych; Uses Crt; Const NazwaPliku : String='osoby.bd'; {Domyślna nazwa pliku z danymi osobowymi} Type { Rekord opisu danych osobowych } OpisOsoby = Record Imie : String[ 20 ]; Nazwisko : String[ 20 ]; Wiek : Integer; { Zbiór znaków, deklaracja niezbędna dla funkcji CzekajNaDozwolonyZnak } ZbiorZnakow = Set Of Char; PlikOsob : File Of OpisOsoby; {Zmienna plikowa identyfikująca plik danych } Rezultatem funkcji jest kopia lancucha S pozamianie wszystkich malych liter na litery duze. Parametry : S to zrodlowy lancuch znakow. Rezultat : kopia lancucha S po zamianie na duze litery. Wejscie : parametry.

Przetwarzanie plików w języku Pascal 9 Wyjscie : rezultat. Funkcja ma charakter pomocniczy. Function DuzeLitery( S : String ) : String; PozycjaWLancuchu : Integer; Roboczy : String; For PozycjaWLancuchu := 1 To Length( S ) Do Roboczy[ PozycjaWLancuchu] := UpCase( S[ PozycjaWLancuchu ] ); Roboczy[ 0 ] := Chr( Length( S ) ); DuzeLitery := Roboczy; Funkcja umozliwa wczytanine jednego ze znakow wchodzacych w sklad zbioru znakow bedacego parametrem DozwoloneZnaki. Znaki nie wystepujace w zbiorze sa ignorowane. Parametry : zbor znakow zawierajacy znaki ktore uzytkownik moze wprowadzic. Rezultat : jeden ze znakow wystepujacych z zborze dozwolone znaki. Wejscie : parametr DozwoloneZnaki. Wyjscie : rtezultat funkcji. Funkcja ma charakter pomocniczy. Function CzekajNaDozwolonyKlawisz( DozwoloneKlawisze: ZbiorZnakow ): Char; Klawisz : Char; Repeat Klawisz := ReadKey; Until Klawisz In DozwoloneKlawisze; CzekajNaDozwolonyKlawisz := Klawisz; Funkcja otwiera plik zawierajacy dane osobowe. Poszukiwany jest plik o nazwie opisanej zmienna globalna NazwaPliku. Jezeli otwarcie sie powiodlo, tzn. istnieje plik o podanej nazwie, funkcja konczy dzialanie z wartoscia True. W przeciwnym przypadku funkcja probuje utworzyc nowy, pusty plik o takiej nazwie. Jeesi ta operacja zakonczy sie sukcesem rezultatem funkcji jest wartosc True, jezeli plik nie zostanie utworzony funkcja konczy dzialanie z wartoscia False. Parametry : brak. Rezultat : wartosc logiczna informujaca o tym, czy plik zostal otwarty. Wejscie : globalna zmienna plikowa PlikOsob, nieskojarzona z zadnym plikiem, stala NazwaPliku zawierajaca nazwe pliku z danymi. Wyjscie : rezultat funkcji oraz zmienna plikowa PlikOsob skojarzona z otwartym plikiem gdy rezultat funkcji rowny wartosci True. Function PlikOsobOtwarty : Boolean; {$I-} { Wylaczenie kontroli poprawnosci operacji wejscia-wyjscia } Assign( PlikOsob, NazwaPliku ); Reset( PlikOsob ); If IOResult <> 0 Then { Sprawdzenie czy plik otwarty poprawnie }

Przetwarzanie plików w języku Pascal 10 { Plik nie istnieje, tworzony jest nowy } Rewrite( PlikOsob ); If IOResult <> 0 Then { Sprawdzenie czy plik zostal utworzony } WriteLn( 'Nie mozna otworzyc nowego pliku bazy danych' ); PlikOsobOtwarty := False; End Else PlikOsobOtwarty := True; End Else PlikOsobOtwarty := True; {$I+} { Wlaczenie kontroli poprawnosci operacji wejscia-wyjscia } Procedura realizuje zestaw przykladowych operacji na pliku danych osobowych. Operacje te obejmuja dopisanie nowego rekordu do pliku, wyswietlenie danych w formie tabeli, wyszukiwanie danych osobowych wedlug nazwiska. Parametry : brak. Wejscie : globalna zmienna plikowa PlikOsob skojarzona z plikiem danych. Wyjscie : Byc moze zmodyfikowany (w przypadku dopisania nowego rekordu) plik dyskowy identyfikowany przez zmienna globalna PlikOsob. Procedure WykonajOperacjeNaPliku; Klawisz : Char; { Zmienna sluzaca do obslugi klawiatury } KoniecProgramu : Boolean; { Zmienna sygnalizujaca zakonczenie programu } Procedura wyswietla na ekranie proste menu, opisujace zestaw operacji jakie moga byc wykonane na pliku danych osobowych. Funkcja lokalna w procedurze WykonajOperacjeNaPliku Procedure WyswietlZestawOperacji; TextColor( LightCyan ); TextBackground( Blue ); ClrScr; WriteLn( '1. Dopisanie nowej osoby' ); WriteLn( '2. Przegladanie spisu osob' ); WriteLn( '3. Wyszukiwanie opisu osoby' ); WriteLn( '4. Zakonczenie' ); Procedura dopisuje nowy rekord do pliku danych, po uprzednim wczytaniu informacji z klawiatury. Wejscie Wyjscie : globalna zmienna plikowa PlikOsob. : zmodyfikowany plik identyfikowany przez zmienna PlikOsob. Funkcja lokalna w procedurze WykonajOperacjeNaPliku

Przetwarzanie plików w języku Pascal 11 Procedure DopiszDaneNowejOsoby; Osoba : OpisOsoby; ClrScr; { Wczytanie danych nowej osoby do pol rekordu Osoba } Write( 'Podaj imie : ' ); ReadLn( Osoba.Imie ); Write( 'Podaj nazwisko: ' ); ReadLn( Osoba.Nazwisko ); Write( 'Podaj wiek : ' ); ReadLn( Osoba.Wiek ); {Aby uniknac niejednoznacznosci do pliku zapisujemy napisy z duzych liter} Osoba.Imie := DuzeLitery( Osoba.Imie ); Osoba.Nazwisko := DuzeLitery( Osoba.Nazwisko ); { Zapis rekordu do pliku osob } Seek( PlikOsob, FileSize( PlikOsob ) ); Write( PlikOsob, Osoba ); Procedura realizuje prosty przeglad danych zapisanych w pliku danych. Informacje sa wyswietlane w formie tabeli, wyswietlanie jest zatrzymywane po zapelnieniu ekranu. Parametr Filtr steruje wyswietlaniem - jezeli parametr ten jest lancuchem pustym (tzn. '') wyswietlane sa wszystkie rekordy, w przeciwnym wypadku wyswietlane sa te rekordy, ktorych pole Nazwisko jest rowne parametrowi Filtr. Parametr jest wykorzystywanie w procedurze realizujaca wyszukiwanie. Parametry : Filtr - steruje wyswietlaniem rekordow jak opisano wyzej. Wejscie : parametr, globalna zmienna plikowa PlikOsob. Wyjscie : informacje wyswietlane na ekranie. Funkcja lokalna w procedurze WykonajOperacjeNaPliku Procedure PrzegladDanychOsobowych( Filtr : String ); Const MaksIloscLinii = 23; {Opisuje maks. ilosc linii informacyjnych na ekranie} Osoba : OpisOsoby; { Roboczcy rekord opisu osoby } LiczbaLinii : Integer; { Licznik Wyswietlonych linii } Procedura wyswietla naglowek tabeli oraz czysci ekran. Funkcja lokalna w procedurze PrzegladDanychOsobowych Procedure WyswietlNaglowek; ClrScr; TextColor( White ); WriteLn( 'Imie': 25, 'Nazwisko' : 25, 'Wiek' : 10 ); TextColor( LightCyan ); {PrzegladDanychOsobowych } { Wszystkie dane zapisane w pliku skladaja sie z duzych liter } Filtr := DuzeLitery( Filtr ); WyswietlNaglowek; { Ustawienie wskaznika pozycji na poczatku pliku } Seek( PlikOsob, 0 ); LiczbaLinii := 0;

Przetwarzanie plików w języku Pascal 12 While Not Eof( PlikOsob ) Do { Odczyt rekordu danych osobowych } Read( PlikOsob, Osoba ); { Wyswietlenie informacji na ekranie } If ( Filtr = '' ) Or ( Osoba.Nazwisko = Filtr ) Then WriteLn( Osoba.Imie : 25, Osoba.Nazwisko : 25, Osoba.Wiek : 10 ); LiczbaLinii := Succ( LiczbaLinii ); { Zatrzymanie wyswietlania po zapelnieniu ekranu } If LiczbaLinii Mod MaksIloscLinii = 0 Then Write( '=>Nacisnij Enter aby kontynuowac przeglad' ); ReadLn; WyswietlNaglowek; LiczbaLinii := 0; If LiczbaLinii < MaksIloscLinii Then Write( '=>Nacisnij Enter aby zakonczyc przeglad' ); ReadLn Procedura realizuje wyszukiwanie dasnych wszystkich osob o nazwisku takim jak podane przez uzytkownika z klawiatury. Wejscie Wyjscie : globalna zmienna plikowa PlikOsob. : zmodyfikowany plik identyfikowany przez zmienna PlikOsob. Funkcja lokalna w procedurze WykonajOperacjeNaPliku Procedure WyszukiwanieOsoby; Nazwisko : String; ClrScr; Write( 'Podaj nazwisko szukanej osoby: ' ); ReadLn( Nazwisko ); PrzegladDanychOsobowych( Nazwisko ); { WykonajOperacjeNaPliku } KoniecProgramu := False; Repeat WyswietlZestawOperacji; Klawisz := CzekajNaDozwolonyKlawisz( [ '1', '2', '3', '4' ] ); Case Klawisz Of '1' : DopiszDaneNowejOsoby; '2' : PrzegladDanychOsobowych( '' ); '3' : WyszukiwanieOsoby; '4' : KoniecProgramu := True; Until KoniecProgramu;

Przetwarzanie plików w języku Pascal 13 Procedura ZamknijPlikOsob zamyka plik skojarzony z globalna zmienna plikowa PlikOsob. Parametry : brak. Wejscie : globalna zmienna plikowa PlikOsob, skojarzona plikiem danych osobowych. Wejscie : plik skojarzony z globalna zmienna PlikOsob jest zamkniety. Procedure ZamknijPlikOsob; Close( PlikOsob ); If PlikOsobOtwarty Then WykonajOperacjeNaPliku; ZamknijPlikOsob; End. Program przykładowy numer 2 Opis funkcjonalny programu: Program prezentuje jeden ze sposobów wykorzystania plików tekstowych. Program wyświetla na ekranie zawartość pliku tekstowego, którego nazwa podawana jest przez użytkownika w linii poleceń, jest zatem parametrem wywołania programu. Wyświetlanie jest zatrzymywane co 24 linie, kontynuacja następuje po naciśnięciu klawisza Enter. Program WyswietlPlikTekstowy; PlikTekstowy : Text; { Zmienna plikowa dla pliku do wyswietlenia } Funkcja PlikOtwarty dokonuje otwarcia pliku, ktorego nazwa zostala podana w linii polecen (jako parametr wywolania programu). W przypadku gdy nie podano zadnego parametru, lub podano wiecej niz jeden funkcja wyswietla komentarz opisujacy sposob wywolania programu i konczy swe dzialnie z wartoscia False. Jezeli podano jeden parametr, funkcja probuje otworzyc plik o nazwie zadanej parametrem. Jezeli otwarcie sie powiodlo, tzn. istnieje plik o podanej nazwie, funkcja konczy dzialanie z wartoscia True. W przeciwnym przypadku funkcja wyswietla komunuikat o bledzie i konczy dzialanie z z wartsca False. Parametry : brak. Rezultat : wartosc logiczna informujaca o tym, czy plik zostal otwarty. Wejscie : globalna zmienna plikowa PlikTekstowy, nieskojarzona z zadnym plikiem. Wyjscie : rezultat funkcji oraz zmienna plikowa PlikTekstowy skojarzona z otwartym plikiem gdy rezultat funkcji rowny wartosci True. Function PlikOtwarty : Boolean; If ParamCount <> 1 Then { Czy w linii polecen jeden parametr? }

Przetwarzanie plików w języku Pascal 14 { Niepoprawna ilosc parametrow wywolania programu, funkcja konczy } { dzialnie z wartoscia False } WriteLn; WriteLn( 'Wywolanie programu: wyswietl <nazwa_pliku_tekstowego>' ); PlikOtwarty := False; End Else {Skojarzenie pliku identyfikowanego przez pierwszy parametr wywolania} {programu z globalna zmienna plikowa PlikTekstowy, nastepnie otwarcie} { z domniemaniem, ze plik istnieje. } {$I-} { Wylaczenie kontroli poprawnosci operacji wejscia-wyjscia } Assign( PlikTekstowy, ParamStr( 1 ) ); Reset( PlikTekstowy ); {$I+} { Wlaczenie kontroli poprawnosci operacji wejscia-wyjscia } If IOResult <> 0 Then { Sprawdzenie czy plik otwarty poprawnie } { Blad otwarcia pliku, funkcja konczy dzialanie z wartoscia False } Write( 'Plik ', ParamStr( 1 ), ' nie moze byc otwarty.' ); PlikOtwarty := False; End Else {Poprawne otwarcia pliku, funkcja konczy dzialanie z wartoscia True} PlikOtwarty := True; Procedura WyswietlPlik wyswietla na ekranie zawartosc pliku tekstowego identyfikowanego przez globalna zmienna PlikTekstowy. Wyswietlania jest zatrzymywane co 24 linie, tak aby uzytkownik mogl obejrzec zawartosc ekranu. Przeglad jest kontynuowany po nacisnieciu klawisza Enter. Parametry : brak. Wejscie : globalna zmienna plikowa PlikTekstowy, skojarzona plikiem do wyswietlenia, wskaznik plikowy pokazuje na poczatek pliku. Wejscie : globalna zmienna plikowa PlikTekstowy, skojarzona plikiem do wyswietlenia, wskaznik plikowy umieszczony na koncu pliku. Procedure WyswietlPlik; LiniaTekstu : String; { Lancuch znakow, tu beda czytane linie z pliku } LicznikLinii : Integer; { Licznik linii odczytanych z pliku } WriteLn; LicznikLinii := 0; While Not Eof( PlikTekstowy ) Do ReadLn( PlikTekstowy, LiniaTekstu ); { Odczyt linii z pliku } WriteLn( LiniaTekstu ); { Wyswietlenie linii na ekranie } LicznikLinii := Succ( LicznikLinii ); { Inkrementacji licznika linii } If LicznikLinii Mod 24 = 0 Then { Wyswietlono kolejne 24 linie tekstu, zatrzymanie wyswietlania } Write( '---Nacisnij Enter aby kontynuowac przeglad---' ); ReadLn; LicznikLinii := 0; End

Przetwarzanie plików w języku Pascal 15 Procedura ZamknijPlik zamyka plik skojarzony z globalna zmienna plikowa PlikTekstowy. Parametry : brak. Wejscie : globalna zmienna plikowa PlikTekstowy, skojarzona plikiem do wyswietlenia. Wejscie : plik skojarzony z globalna zmienna PlikTekstoey jest zamkniety. Procedure ZamknijPlik; Close( PlikTekstowy ); { Program glowny } If PlikOtwarty Then WyswietlPlik; ZamknijPlik; End. Program przykładowy numer 3 Opis programu: Program prezentuje sposoby wykorzystania plikow amorficznych do realizacji szybkiego, blokowego odczytu i zapisu danych. Program realizuje kopiowanie plikow. Nazwa pliku zrodlowego stanowi pierwszy parametr wywolania programu, drugi parametr reprezentuje nazwe pliku docelowego. Program Kopiuj; Const DlugoscBufora = 1024; { Rozmiar bufora kopiowania } PlikZrodlowy : File; { Plik z ktorego beda pobierane dane } PlikDocelowy : File; { Plik do ktorego beda dane zapisywane } Bufor : Array[ 1.. DlugoscBufora ] Of Byte; { Bufor kopiowania } Funkcja PlikiOtwarte dokonuje otwarcia plikow, ktorych nazwy zostaly podane w linii polecen (jako parametry wywolania programu). W przypadku gdy podano bledna ilosc parametrow funkcja wyswietla komentarz opisujacy sposob wywolania programu i konczy swe dzialnie z wartoscia False. Jezeli podano dwa parametry, funkcja probuje otworzyc pliki. Jezeli otwarcie sie powiodlo,tzn. istnieja pliki o podanych nazwach, funkcja konczy dzialanie z wartoscia True. W przeciwnym przypadku funkcja wyswietla komunuikat o bledzie i konczy dzialanie z wartosca False. Parametry : brak. Rezultat : wartosc logiczna informujaca o tym, czy pliki zostaly otwarte. Wejscie : globalne zmienne plikowe PlikZrodlowy i PlikDocelowy, nieskojarzona z zadnym plikiem. Wyjscie : rezultat funkcji oraz zmienne PlikZrodlowy i PlikDocelowy skojarzona z otwartymi plikiami gdy rezultat funkcji rowny True. Function PlikiOtwarte : Boolean; If ParamCount <> 2 Then { Czy w linii polecen dwa parametry? }

Przetwarzanie plików w języku Pascal 16 { Niepoprawna ilosc parametrow wywolania programu, funkcja konczy } { dzialnie z wartoscia False } WriteLn; WriteLn( 'Wywolanie programu:' ); WriteLn( 'kopiuj <nazwa_pliku_zrodlowego> <nazwa_pliku_docelowego>' ); PlikiOtwarte := False; End Else {Skojarzenie pliku identyfikowanego przez pierwszy parametr wywolania} {programu z globalna zmienna plikowa PlikZrodlowy, nastepnie otwarcie} {z istniejacego pliku, rozmiar bloku rowny jednemu bajtowi } {$I-} { Wylaczenie kontroli poprawnosci operacji wejscia-wyjscia } Assign( PlikZrodlowy, ParamStr( 1 ) ); Reset( PlikZrodlowy, 1 ); {$I+} { Wlaczenie kontroli poprawnosci operacji wejscia-wyjscia } If IOResult <> 0 Then { Sprawdzenie czy plik otwarty poprawnie } WriteLn; { Blad otwarcia pliku, funkcja konczy dzialanie z wartoscia False } Write( 'Plik zrodlowy ', ParamStr( 1 ), ' nie moze byc otwarty.' ); PlikiOtwarte := False; End Else {Skojarzenie pliku identyfikowanego przez drugi parametr programu} {z globalna zmienna PlikDocelowy, nastepnie otwarcie nowego pliku} {do zapisu} {$I-} { Wylaczenie kontroli poprawnosci operacji wejscia-wyjscia } Assign( PlikDocelowy, ParamStr( 2 ) ); Rewrite( PlikDocelowy, 1 ); {$I+} { Wlaczenie kontroli poprawnosci operacji wejscia-wyjscia } If IOResult <> 0 Then { Sprawdzenie czy plik otwarty poprawnie } { Blad otwarcia pliku, wyjscie z wartoscia False } Close( PlikZrodlowy ); WriteLn; Write( 'Plik docelowy', ParamStr(2), ' nie moze byc otwarty.'); PlikiOtwarte := False; End Else { Poprawne otwarcia plikow, wyjscie z rezultatem True } PlikiOtwarte := True; End { If IOResult <> 0... } {If ParamCount <> 0... } Procedura KopiujPlik realizuje kopiowanie zawartosci pliku inedntyfikowanego prezez zmienna plikowa PlikZrodlowy do pliku identyfikowanego przez PlikDocelowy. Kopiowanie odbywa sie poprzez bufor kopiowania Bufor o rozmiarze DlugoscBufora. Zarowno odczytowi jak i zapisowi podlegaja bloki o rozmiarze jednego bajta w ilosci DlugoscBufora. Parametry : brak. Wejscie : globalne zmienne plikowe PlikZrodlowy i PlikDocelowy, skojarzone plikami zadanymi parametrami wywolania, wskazniki plikowe ustawione na poczatkach plikow.

Przetwarzanie plików w języku Pascal 17 Wejscie : globalne zmienne plikowe PlikZrodlowy i PlikDocelowy, skojarzone plikami zadanymi parametrami wywolania, wskazniki plikowe ustawione na koncach plikow. Procedure KopiujPlik; BladKopiowania : Boolean; OdczytaneBloki, ZapisaneBloki : Word; WriteLn( 'Trwa kopiowanie ', ParamStr( 1 ), ' do ', ParamStr( 2 ), '...' ); Repeat { Odczyt blokow jednobajtowych w ilosci DlugoscBufora do zmiennej Bufor } { z zapamietaniem ilosci rzeczywiscie przeczytanych blokow w zmiennej } { OdczytaneBloki. } BlockRead( PlikZrodlowy, Bufor, DlugoscBufora, OdczytaneBloki ); { Zapis tylu jednobajtowych blokow ile uprzednio przeczytano z zapamie- } { taniem ilosci rzeczywiscie zapisanych blokow w zmiennej ZapisaneBloki.} BlockWrite( PlikDocelowy, Bufor, OdczytaneBloki, ZapisaneBloki ); { Jezeli ilosc odczytanych blokow rozni sie od ilosci blokow zapisanych } { to w trakcie kopiowania wystapil blad-zmienna BladKopiowania otrzymuje} { wtedy wartosc True, kopiowanie jest przerywane } BladKopiowania := ZapisaneBloki <> OdczytaneBloki; { Kopiowanie konczy sie w momencie gdy procedura BlockRead nie odczyta } { zadnego bloku lub wystapil blad w trakcie kopiowania } Until ( OdczytaneBloki = 0 ) Or BladKopiowania; If BladKopiowania Then WriteLn( 'Blad w czasie kopiowania!' ) Else WriteLn( 'Kopiowanie zakonczone.' ); Procedura ZamknijPliki zamyka pliki skojarzony z globalnymi zmiennymi plikowymi PlikZrodlowy i PlikDocelowy. Parametry : brak. Wejscie : globalne zmienne plikowe PlikDocelowy i PlikZrodlowy skojarzone z plikami uczastniczacymi w kopiowaniu. Wejscie : pliku skojarzone z globalnymi zmiennymi plikowymi PlikDocelowy i PlikZrodlowy sa zamkniete. Procedure ZamknijPliki; Close( PlikZrodlowy ); Close( PlikDocelowy ) { Program glowny } If PlikiOtwarte Then KopiujPlik; ZamknijPliki; End. 7. Zadania

Przetwarzanie plików w języku Pascal 18 1. Napisać program SLOWA otrzymujący jako parametr wywołania nazwę pliku zawierającego dowolny tekst ASCII..Zadaniem programu jest wyświetlenie na ekranie poszczególnych słów zawartych w pliku w kolejnych wierszach ekranu, po jednym słowie w jednej linii. Jako słowo należy traktować każdy ciąg liter, cyfr rozpoczynający się od litery. 2. Napisać program OBLICZ otrzymujący jako parametr wywołania nazwę pliku zawierającego liczby Integer (File of Integer). Zadaniem programu jest realizacja następujących operacji: wyznaczenie wartości minimalnej, wyznaczenie wartości maksymalnej, wyznaczenie wartości średniej. Wszystkie wyniki mają zostać wyświetlone na ekranie. 3. Napisać program STAT otrzymujący jako parametr wywołania nazwę pliku zawierającego dowolny tekst ASCII. Zadaniem programu jest wyświetlenie na ekranie statystyki pliku obejmującej informację o:ilości wszystkich znaków w pliku, ilości dużych i małych liter, ilości cyfr. 4. Napisać program HISTO otrzymujący jako parametr wywołania nazwę pliku zawierającego dowolny tekst ASCII. Zadaniem programu jest wyświetlenie na ekranie histogramu częstości występowania znaków w zadanym pliku. Histogram ma być wyświetlony w orientacji pionowej. 5. Napisać program FILTR otrzymujący jako parametr wywołania nazwę pliku zawierającego dowolny tekst ASCII. Zadaniem programu jest wyświetlenie na ekranie tych linii tekstu, które zawierają łańcuch znaków podany jako drugi parametr wywołania programu. 6. Napisać program NAGLOWKI otrzymujący jako parametr wywołania nazwę pliku zawierającego dowolny tekst źródłowy programu w języku Pascal. Zadaniem programu jest wyświetlenie na ekranie tylko tych linii tekstu źródłowego, które zawierają nagłówek procedury lub funkcji. 7. Napisać program KOMENT otrzymujący jako parametr wywołania nazwę pliku zawierającego dowolny tekst źródłowy programu w języku Pascal. Zadaniem programu jest wyświetlenie na ekranie współczynnika skomentowania programu, liczonego jako wyrażony w procentach stosunek ilości znaków zawartych w komentarzach do ogólnej ilości znaków w pliku. 8. Napisać program KLEJ realizujący łączenie plików. Pierwszy parametr wywołania programu zawiera nazwę pliku, w którym ma być zapisana połączona zawartość plików, których nazwy stanowią kolejne parametry wywołania programu (począwszy od parametru drugiego). 9. Napisać program SZYFRUJ realizujący szyfrowanie i deszyfrowanie zawartości pliku o nazwie podanej w drugim parametrze wywołania programu. Pierwszym parametrem ma być znak S lub D strujący wykonaniem programu: S oznacza wykonanie szyfrowania, D oznacza deszyfrowanie. Należy zastosować najprostszy podstawieniowy szyfr Cezara. 10. Napisać program WYSWIETL realizujący wyświetlanie na ekranie lub wyprowadzający na drukarkę zawartość pliku ASCII, o nazwie podanej w drugim parametrze wywołania programu. Pierwszy parametr to odpowiednio E jeżeli zawartość pliku ma być wyświetlana na ekranie lub D jeżeli ma być wyprowadzona na drukarkę. 11. Napisać program EWTOW realizujący funkcje ewidencjonowania towarów. Towar ma być opisany jego nazwą, ilością opakowań, ceną zakupu. Program ma umożliwiać dopisanie towaru do ewidencji, skasowanie, aktualizację ilości i ceny, wyszukiwanie według nazwy towaru, wyszukiwanie towaru o minimalnej i maksymalnej ilości, informowanie o aktualnej sumarycznej wartości towaru w danym asortymencie oraz o globalnej wartości wszystkich towarów w magazynie. 12. Napisać program EWCD realizujący funkcje ewidencjonowania zbiory płyt kompaktowych. Pojedyncza płyta ma byc opisana nazwą wykonawcy, nazwą płyty, czasem trwania, statusem informującym czy jest wypożyczona, jeżeli tak to powinno być wiadomo komu (imię, nazwisko). Program ma umożliwiać dopisanie płyty do kolekcji, skasowanie, aktualizację błędnie wprowadzonego opisu płyty, rejestrowanie zjawiska wypożyczenia płyty (kiedy, komu), wyszykiwanie płyty według nazwy, nazwy wykonawcy, wyszukiwanie płyt wypożyczonych.

Przetwarzanie plików w języku Pascal 19 Bibliografia 1. Niklaus Wirth: Wstęp do programowania systematycznego, Wydawnictwo Naukow-Techniczne, Warszawa 1987. 2. Niklaus Wirth: ALGORYTMY + STRUKTURY DANYCH = PROGRAMY, Wydawnictwo Naukow-Techniczne, Warszawa 1989. 3. Michał Iglewski, Jan Madey, Stanisław Matwin: Pascal, Wydawnictwo Naukowo-Techniczne 1986. 4. Borland International, Inc:Turbo Pascal, ver. 6.0, Library Reference, 1983. 5. Borland International, Inc:Turbo Pascal, ver. 6.0, Programmer s Guide, 1983.