Lazarus – PLIKI
Pliki
Pliki są formą przechowania danych, po
wyłączeniu programu.
Mogą zawierać dane wprowadzone via
program jak i niezbędne dane
konfiguracyjne wymagane do poprawnej
pracy programu.
Pliki mogą być „formatu” tekstowego lub
binarnego.
2
Pliki tekstowe
Plik tekstowy to plik:
- składający się z tekstu i formatowany zgodnie z przyjętym
standardem, zazwyczaj ASCII, UNICODE
- Zawierający dodatkowo znaki formatowania np. przejścia
końca linii i przejścia nowej linii (#13#10), znaki tabulacji
itp.
(Label1.Caption: = 'Pierwsza linia' + # 13 # 10 + 'Druga linia
„)
- wykorzystywany bardzo często jako plik konfiguracyjny,
dokumentacyjny etc.
- Przykłady: .txt, .htm, .xml
Plikiem tekstowy nie są plik zapisane w edytorach tekstu w
ich natywnym formacie a nawet .rtf
3
Pliki binarne
Plik binarny jest plikiem:
- o dowolnej zawartości, oznacza więc wszystkie pliki
poza plikami tekstowymi choć i do nich można
podchodzić (obsługiwać je) jak do binarnych
- tworzonym przez programy narzucające im „swoją”
wewnętrzną strukturę, której naruszenie może
sprawić, że stanie się niepoprawny dla programów je
obsługujących.
- którego zawartość można edytować za pomocą
edytora heksadecymalnego, który umożliwia edycję
wartości poszczególnych bajtów w pliku.
4
Obsługa plików tekstowych
Klasyczne podejście do pracy z plikami
tekstowymi bardzo często
porównywane jest do zapisu lub
odczytu z taśmy
magnetofonowej/magnetowidowej tj.
całą „porcję informacji” zapisuje się
po kolei od początku do końca.
(możliwa ale nie zalecane jest
dokonywanie przeskoków w „treści”
pliku podczas pracy)
5
Pliki tekstowe
Praca z plikiem tekstowym wymaga:
1) użycia zmiennej zawierającej wskazanie na plik tzw. uchwyt. Musi ona być
typu TextFile:
var Plik:TextFile;
2) Przypisania do tej zmiennej wskazania na konkretny plik (podajemy jego
nazwę lub całą ścieżkę):
AssignFile(Plik,’nazwa.pliku’);
3) Ustalenia formy dalszej pracy z plikiem (odczyt, zapis, modyfikacja)
a)
Reset(plik)
;//przygotowanie do odczytu (wskaźnik pliku ustawiany na
jego początek)
b)
Rewrite(plik)
;//przygotowanie do zapisu (tworzenie nowego pliku o
podanej uprzednio w w „assignfile” nazwie. Jeśli plik tak już jego zawartość
zostanie usunięta)
c)
Append(plik)
;// przesuwa kursor pliku na koniec pliku
4) Dokonanie operacji na pliku (dodanie danych, odczytanie danych)
a)
ReadLn(plik,bufor); Read(plik,bufor);
b)
Writeln(plik:bufor); Write(plik, bufor);
5) Zamknięcie pliku
CloseFile(plik);
6
Pliki tekstowe – przykład
zapisu
var
plik_zapis: Textfile;
begin
AssignFile(plik_zapis, 'nazwa.txt');
Rewrite(plik_zapis);
Writeln(plik_zapis, 'ABCD');
Write(plik_zapis, 'EFGH');
Writeln(plik_zapis, 'IJKL');
CloseFile(plik_zapis);
end;
7
Pliki tekstowe – przykład dopisania
danych
var
plik_zapis: textfile;
begin
AssignFile(plik_zapis, 'nazwa.txt');
Append(plik_zapis);
Writeln(plik_zapis, '1234');
CloseFile(plik_zapis);
end;
8
Zapis pliku tekstowego
Instrukcja Flush(plik);
9
Pliki tekstowe – przykład
odczytu
var
plik_odczyt: textfile;
s:string;
begin
AssignFile(plik_odczyt, 'nazwa.txt');
Reset(plik_odczyt);
Readln(plik_odczyt,s);
Memo1.Lines.add(s);
Readln(plik_odczyt,s);
Memo1.Lines.add(s);
Readln(plik_odczyt,s);
Memo1.Lines.add(s);
CloseFile(plik_odczyt);
end;
//czego możemy się spodziewać przy próbie odczytu większej ilości linii niż rzeczywista ich ilość w
pliku?
10
Pliki tekstowe – przykład odczytu (2)
Funkcja
EOF
(ang.End Of File) – informuje czy został osiągnięty koniec pliku.
Dodanie do zawartość komponentu Memo1
wszystkich linii zawartych w pliku tekstowym (ilość linii jest nieznana w trakcie wykonywania
programu)
var
plik_odczyt: textfile;
s: string;
begin
AssignFile(plik_odczyt, 'nazwa.txt');
Reset(plik_odczyt);
while (EOF(plik_odczyt) = false)
do
begin
Readln(plik_odczyt, s);
Memo1.Lines.add(s);
end;
CloseFile(plik_odczyt);
end;
11
Wyjątki!!!
• var
• plik_zapis: textfile;
• begin
• AssignFile(plik_zapis, 'nazwa.txt');
•
try
• Append(plik_zapis);
• Writeln(plik_zapis, '1234');
•
finally
• CloseFile(plik_zapis);
•
end
;
• end;
12
Wyjątki (2)
try
//instrukcje mogące wywołać wystąpienie wyjątku
except
//instrukcje wykonywane w razie wystąpienia wyjątku
end;
try
//instrukcje mogące wywołać wystąpienie wyjątku
except
on E: Exception do ShowMessage(E.Message+'
'+IntToStr(E.HelpContext));
end;
13
Pliki binarne - amorficzne
Nie mają jednolitej – jawnie
ustrukturyzowanej budowy.
Dostęp do ich zawartości następuje z
reguły przez odczyt/zapis
poszczególnych bajtów (ich grup)
14
Pliki binarne - amorficzne
Praca z plikiem binarnym wymaga:
1)
użycia zmiennej zawierającej wskazanie na plik tzw. uchwyt. Musi ona być typu File:
var Plik:File;
2) Przypisania do tej zmiennej wskazania na konkretny plik (podajemy jego nazwę lub
całą ścieżkę):
AssignFile(Plik,’nazwa.pliku’);
3) Ustalenia formy dalszej pracy z plikiem (odczyt, zapis, modyfikacja)
a)
Reset(plik,1)
;//przygotowanie do odczytu (wskaźnik pliku ustawiany na jego
początek, drugi parametr to wielkość odczytywanych jednorazowo pakietów)
b)
Rewrite(plik,1)
;//przygotowanie do zapisu (tworzenie nowego pliku o podanej
uprzednio w w „assignfile” nazwie. Jeśli plik tak już jego zawartość zostanie usunięta)
Drugi parametr to wielkość odczytywanych jednorazowo pakietów)
4) Dokonanie operacji na pliku (dodanie danych, odczytanie danych)
BlockWrite(plik, Bufor,ile_danych_zapisac);
BlockRead(zrodlo, Bufor, ile_danych_odczytać, ile_udało_sie_odczytac)
5) Zamknięcie pliku
CloseFile(plik);
15
Pliki binarne - odczyt
var
F : File;
Bufor : array[0..100] of char;
ile:integer;
begin
AssignFile(F, 'nazwa.txt');
Reset(F,1);
BlockRead(F, Bufor, SizeOf(Bufor),ile);
CloseFile(F);
end;
16
Pliki binarne zapis
var
F: File;
Bufor: array[1..5] of char;
i: integer;
begin
for I := 1 to 5 do
Bufor[i] := 'A';
AssignFile(F, 'nazwa3.txt');
Rewrite(F, 1);
BlockWrite(F, Bufor, SizeOf(Bufor));
CloseFile(F);
end;
17
Pliki binarne przykład zastosowania –
kopiowanie pliku
var
zrodlo, cel: File;
Bufor: array[0..1024] of Char;
Ile: Integer;
begin
ile := 1;
//przygotowanie zmiennych plikowych
AssignFile(zrodlo, 'nazwa.txt');
Reset(zrodlo, 1);
AssignFile(cel, 'nazwa_kopia.txt');
Rewrite(cel, 1);
//główna pętla kopiująca
while ile > 0 do
begin
BlockRead(zrodlo, Bufor, SizeOf(Bufor), ile);
BlockWrite(cel, Bufor, ile);
end;
CloseFile(cel);
CloseFile(zrodlo);
end;
18
Pliki typowane/rekordowe
Cechy:
- zapisywane/odczytywane są całek
pakiety danych (rekordy)
- Możliwość jednoczesnego zapisu i
odczytu (w odróżnieniu od
wcześniejszych typów plikowych)
- Konieczność zdefiniowania struktury
odczytywanej/zapisywanej struktury
(rekordu)
19
Pliki rekordowe
Definicja struktury:
Type
TPorcja_Danych=record
X:double;
Y:double;
Nazwa:String[200];//koniecznie podana wielkość
End;
Definicja nowego typu
Type
TPlik_rekordowy=file of TPorcja_Danych;
20
Pliki rekordowe
Praca z plikiem binarnym po uprzednim zadeklarowaniu typu rekordowego i pliku
typowanego opartego na tym typie wymaga:
1) użycia zmiennej zawierającej wskazanie na plik tzw. uchwyt. Musi ona nowym
zdefiniowanym typem pliku rekordowego:
var Plik:TPlik_rekordowy;
2) Przypisania do tej zmiennej wskazania na konkretny plik (podajemy jego nazwę
lub całą ścieżkę):
AssignFile(Plik,’nazwa.pliku’);
3) Ustalenia formy dalszej pracy z plikiem (odczyt, zapis, modyfikacja)
a)
Reset(plik)
;//przygotowanie do odczytu (wskaźnik pliku ustawiany na jego
początek
b)
Rewrite(plik)
;//przygotowanie do zapisu (tworzenie nowego pliku o podanej
uprzednio w w „assignfile” nazwie. Jeśli plik tak już jego zawartość zostanie
usunięta)
4) Dokonanie operacji na pliku (dodanie danych, odczytanie danych)
a)
Read(plik,zmienna_rekordowa);
b)
Write(plik, zmienna_rekordowa);
5) Zamknięcie pliku
CloseFile(plik);
21
Pliki rekordowe – zapis
danych
var
plik: TPlik_rekordowy;
zmienna_rekordowa: TPorcja_Danych;
begin
zmienna_rekordowa.X := 10;
zmienna_rekordowa.y := 12;
zmienna_rekordowa.Nazwa := 'Punkt nr 1020';
AssignFile(plik, 'nowy_plik.dat');
Rewrite(plik);
Write(plik, zmienna_rekordowa);
closefile(plik);
end;
22
Pliki rekordowe – dopisywanie danych
(
seek
– substytut append)
var
plik: TPlik_rekordowy;
zmienna_rekordowa: TPorcja_Danych;
begin
zmienna_rekordowa.X := 10;
zmienna_rekordowa.y := 12;
zmienna_rekordowa.Nazwa := 'Punkt nr 1021';
AssignFile(plik, 'nowy_plik.dat');
Reset(plik);//
Seek(plik, FileSize(plik)); //drugi parametr mówi do
którego elementu rekordowego w pliku ma nastąpić skok
Write(plik, zmienna_rekordowa);
closefile(plik);
end;
23
Pliki rekordowe – odczyt danych
var
plik: TPlik_rekordowy;
zmienna_rekordowa: TPorcja_Danych;
begin
AssignFile(plik, 'nowy_plik.dat');
Reset(plik);
Seek(plik, 1);
read(plik, zmienna_rekordowa);
Closefile(plik);
ShowMessage(zmienna_rekordowa.Nazwa);
end;
24
Strumienie, pliki
strumieniowe
25
KONIEC
Mimo wszystko dziękuję za
uwagę
26