OPERACJE NA PLIKACH
Podstawowe pojęcia:
Plik fizyczny − zbiór informacji w pamięci zewnętrznej wykorzystywany do trwałego przechowywania danych lub jako przedłużenie pamięci operacyjnej w przypadku przetwarzania struktur danych o dużych rozmiarach.
Plikami fizycznymi mogą być:
plik dyskowy − plik fizyczny przechowywany na nośniku o własności trwałego zapamiętywania zapisanych danych: dyskietka, dysk stały, taśma, płyta CD, karta magnetyczna, ...
Plik dyskowy jest identyfikowany poprzez symbol napędu, ścieżkę dostępu do pliku (lista podkatalogów) oraz nazwę pliku:
'C:\MojeDokumenty\Programy\Program1.pas'
urządzenia wejścia/wyjścia − klawiatura, monitor ekranowy, drukarka, porty szeregowe.
Urządzenie wejścia/wyjścia jest identyfikowane poprzez łańcuch znakowy zawierający jego nazwę:
'CON' konsola
'LPT1' drukarka nr 1
'LPT2' drukarka nr 2
'PRN' domyślna drukarka
'COM1' port szeregowy nr 1
'COM2' port szeregowy nr 2
'AUX' domyślny port szeregowy
'NUL' urządzenie puste
Zmienna plikowa − model logiczny służący do reprezentacji pliku fizycznego w programie,
Zmienna plikowa jest wykorzystywana do komunikacji pomiędzy programem a urządzeniem przechowującym plik fizyczny.
W języku PASCAL można wykorzystywać trzy logiczne modela pliku:
pliki zdefiniowane (inaczej elementowe),
− pliki zawierające ciąg elementów tego samego typu np.: ciąg liczb całkowitych, ciąg rekordów opisujących osoby, itd...
pliki niezdefiniowane (inaczej amorficzne),
− pliki zawierające ciąg bajtów, których interpretację określa programista. Pliki amorficzne najczęściej są wykorzystywane do przetwarzania obrazów, dźwięków, itp..
pliki tekstowe.
− pliki zawierające ciąg znaków reprezentujące sformatowane teksty, np. programy źródłowe w języku Pascal, opisy i dokumentacje programów, itp..
OGÓLNY SCHEMAT PRZETWARZANIA PLIKÓW
1. Deklaracja zmiennych plikowych
type element_pliku = definicja_typu;
Tplik_przykladowy = file of element_pliku;
var plik_przykladowy : Tplik_przykladowy;
2. Skojarzenie zmiennej plikowej z plikiem fizycznym
assign( plik_przykladowy, 'c:\wyklad\przyklad_1.dat' );
3. Otwarcie pliku
rewrite( plik_przykladowy ); {otwarcie do zapisu, utworzenie}
lub
reset( plik_przykladowy ); {otwarcie do odczytu, aktualizacji}
4. Przetwarzanie zawartości pliku fizycznego
for i := 1 to 10 do
begin
read( dana );
write( plik_przykladowy , dana );
end;
lub
while not eof( plik_przykladowy ) do
begin
read( plik_przykladowy , dana );
writeln( dana );
end;
5. Zamknięcie pliku
close( plik_przykladowy );
PLIKI ZDEFINIOWANE (ELEMENTOWE)
Plik zdefiniowany zawiera ciąg elementów tego samego typu np.: ciąg liczb całkowitych, ciąg rekordów opisujących osoby, itd...
Dostęp do elementów pliku jest sekwencyjny. Wyróżniony element (pozycja bieżąca) jest wskazywane za pomocą specjalnego wskaźnika.
Bezpośrednio po otwarciu pliku wskaźnik pozycji bieżącej wskazuje na pozycję zerową (początek pliku).
Każda operacja odczytu/zapisu dotyczy bieżącej pozycji pliku.
Po każdej operacji odczytu/zapisu wskaźnik bieżącej pozycji jest automatycznie przesuwany na następną pozycję.
Położenie bieżącej pozycji pliku można odczytać za pomocą funkcji FilePos
Położenie bieżącej pozycji pliku można zmieniać za pomocą procedury Seek.
Deklaracja typu i zmiennej plikowej dla plików elementowych
TYPE
TypPlikowy = FILE OF Element ;
VAR
ZmiennaPlikowa : TypPlikowy ;
ZmiennaPlikowa_2 : FILE OF Element_2;
Typ Element elementu pliku może być typem: liczbowym, znakowym, łańcuchowym, strukturalnym typem tablicowym lub typem rekordowym.
Nie może być typem plikowym !
procedurY i funkcjE do operącji na plikach ELEMENTOWYCH
ASSIGN(zp,nazwa); ← Skojarzenie zmiennej plikowej z plikiem fizycznym
REWRITE(zp); ← Otwarcie do zapisu / utworzenie pliku
RESET(zp); ← Przygotowanie pliku do odczytu
WRITE(zp,dane); ← Zapis / dopisanie elementu do pliku
READ(zp,zmienna); ← Odczyt elementu z pliku
EOF(zp):Boolean; ← Sygnalizacja końca pliku
CLOSE(zp); ← Zamykanie pliku
Dodatkowe funkcje dotyczące pliku elementowego
FILESIZE(zp):Longint; ← liczba elementów pliku
FILEPOS(zp):Longint; ← aktualne położenie wskaźnika pliku
SEEK(zp, pozycja); ← ustawienie wskaźnika na zadanej pozycji
TRUNCATE(zp); ← „Obcięcie” / skrócenie długości pliku
ERASE(zp); ← Kasowanie pliku
RENAME(zp,NowaNazwa); ← Zmiana nazwy pliku
Przykład 1 Zapis do pliku danych odczytywanych z klawiatury i wydruk na ekran danych odczytywanych z pliku
TYPE
Plik_liczb = file of integer;
VAR
Liczba : integer;
Plik : file of integer;
Procedure ZapiszDaneZKlawiatury;
begin
Assign(Plik, 'liczby.bin');
Rewrite(Plik);
repeat
Read(Liczba); { odczyt danych z klawiatury }
Write(Plik, Liczba); { zapis danych do pliku }
until Liczba = 0; { wprowadzanie zera kończy zapis }
Close(Plik);
end;
Procedure DrukujDaneNaEkran;
begin
Assign(Plik, 'liczby.bin');
Reset(Plik);
while not Eof(Plik) do
begin
Read(Plik, Liczba); { odczyt danych z pliku }
Write(Liczba:4); { wydruk danych na ekran }
end;
Close(Plik);
end;
Przykład 2 Zapis i odczyt danych zapamiętanych w tablicy.
CONST
N = 100;
TYPE
t_tablica = array[ 1 .. N ] of integer;
VAR
tablica : t_tablica;
il_elem : integer;
plik_liczb : file of integer;
plik_tablic : file of t_tablica;
Jednorazowe składowanie całej tablicy:
Procedure ZapiszCalaTablice;
begin
Assign( plik_tablic, `nazwa' );
Rewrite( plik_tablic );
Write( plik_tablic, tablica );
Close( plik_tablic );
end;
Jednorazowe odczytanie całej tablicy:
Procedure OdczytajCalaTablice;
begin
Assign( plik_tablic, `nazwa' );
Reset( plik_tablic );
Read( plik_tablic, tablica );
Close( plik_tablic );
end;
Składowanie zawartości tablicy pojedynczymi elementami:
Procedure ZapiszElementyTablicy;
begin
Assign(plik_liczb, `nazwa');
Rewrite(fe);
for i := 1 to il_elem do
Write( plik_liczb, tablica[ i ] );
Close( plik_liczb );
end;
Odczytywanie pojedynczych elementów tablicy:
Procedure OdczytajElementyTablicy;
begin
Assign( plik_liczb, `nazwa' );
Reset( plik_liczb );
il_elem := 0;
while not EOF( plik_liczb ) do
begin
il_elem := il_elem + 1;
Read( plik_liczb, tab[ il_elem ] );
end;
Close( plik_liczb );
end;