1
POLITECHNIKA WARSZAWSKA
Instytut Automatyki i Robotyki
POLITECHNIKA WARSZAWSKA
Instytut Automatyki i Robotyki
ZASADY PROGRAMOWANIA KOMPUTERÓW
Język programowania:
Pascal
Ś
rodowisko programistyczne:
Delphi
Temat 3 :
Tablice, rekordy i pliki
Wykład 6 :
Pliki tekstowe
ZASADY PROGRAMOWANIA KOMPUTERÓW
Język programowania:
Pascal
Ś
rodowisko programistyczne:
Delphi
Temat 3 :
Tablice, rekordy i pliki
Wykład 6 :
Pliki tekstowe
2
Pliki tekstowe
Pliki tekstowe
Pliki tekstowe – składają się ze znaków (widocznych lub niewidocznych) i są
podzielone na wiersze. Dostęp do plików tekstowych jest możliwy za pomocą
zmiennych plikowych
typu
text
,
które są logicznymi modelami plików
tekstowych.
Operacje na PLIKACH TEKSTOWYCH
– wykonywane są z użyciem podprogramów
assign
(
zmienna plikowa
, nazwa pliku)
- skojarzenie zmiennej plikowej z nazwą
rzeczywistego pliku dyskowego
reset
(
zmienna plikowa
) - przygotowanie pliku do odczytu
(„przewinięcie” na początek pliku)
rewrite
(
zmienna plikowa
) - przygotowanie pliku do zapisu od początku
append
(
zmienna plikowa
) - przygotowanie pliku do dopisywania
close
(
zmienna plikowa
) - zamknięcie pliku
eof
(
zmienna plikowa
) - funkcja typu boolean, która zwraca
informację, czy napotkano koniec pliku
3
Operacje wykonywane na plikach
Operacje wykonywane na plikach
Wczytywanie danych z pliku
var
plik
:
text
;
...
begin
...
assign
(
plik
, nazwa_pliku);
reset
(
plik
);
...
readln (
plik
, ...);
...
close
(
plik
);
...
end.
Wczytywanie kolejnych danych aż do
końca pliku:
while not
eof
(
plik
) do
begin
...
readln (
plik
, ...) ;
...
end
;
4
Operacje wykonywane na plikach (1)
Operacje wykonywane na plikach (1)
Zapisywanie danych do pliku
var
plik
:
text
;
...
begin
...
assign
(
plik
, nazwa_pliku);
rewrite
(
plik
);
...
writeln (
plik
, ...);
...
close
(
plik
);
...
end.
Uwaga: Jeśli plik o podanej
nazwie nie istnieje, zostanie
utworzony; jeśli zaś istnieje,
to zostanie zapisany nową
zawartością.
Dopisywanie na końcu danych do pliku
var
plik
:
text
;
...
begin
...
assign
(
plik
, nazwa_pliku);
append
(
plik
);
...
writeln (
plik
, ...);
...
close
(
plik
);
...
end.
Uwaga: plik o podanej
nazwie musi istnieć.
5
Wczytywanie danych z pliku
Wczytywanie danych z pliku
Instrukcja czytania
read
(
zmienna_plikowa
, zmienna_1, zmienna_2, ... , zmienna_n);
lub
readln
(
zmienna_plikowa
, zmienna_1, zmienna_2, ... , zmienna_n);
Za pomocą instrukcji
readln
można wczytać jedynie zmienne typu:
integer
char
real
string
Nie można natomiast wczytać zmiennej logicznej (typu boolean), ani tablicy (w
całości), ani rekordu (w całości).
Uwaga 1: Łańcuchy wczytujemy zawsze instrukcją readln, nie read.
readln
(
zmienna_plikowa
) – powoduje przejście do następnego wiersza pliku
6
Zapisywanie danych do pliku
Zapisywanie danych do pliku
Instrukcja zapisywania ( drukowania )
write
(
zmienna plikowa
, wyrażenie_1, wyrażenie_2, ... wyrażenie_n)
lub
writeln
(
zmienna plikowa
, wyrażenie_1, wyrażenie_2, ... ,wyrażenie_n)
Wyrażenia liczbowe
wyr
można wyprowadzać w jednej z następujących postaci:
wyr wyr
:
m
wyr
:
m
:
n
m
- minimalna szerokość pola przeznaczonego na liczbę; jeśli wartość
m
jest za duża,
pole będzie wypełnione spacjami przed liczbą; jeśli wartość
m
jest za mała, liczba zajmie
tyle miejsca, ile potrzeba.
Zatem – jeśli chcemy drukować liczby pod sobą w równych kolumnach (np. elementy
tablicy dwuwymiarowej), to szerokość pola
m
musi być na tyle duża, by wszystkie liczby
się w tym polu mieściły z jakimś nadmiarem.
n
- liczba miejsc po kropce dziesiętnej (podaje się
tylko dla liczb rzeczywistych
)
writeln
(
zmienna plikowa
) – powoduje wstawienie znaku końca wiersza do pliku
Każde zapisywane wyrażenie może być jednego z następujących typów:
integer real char string boolean
7
Łańcuchy ( napisy ) i operacje na nich
Łańcuchy ( napisy ) i operacje na nich
Łańcuch służą do reprezentowania ciągu znaków. Elementami typu łańcuchowego są
łańcuchy o maksymalnej zdefiniowanej ilości znaków.
Typ łańcuchowy
string
(
ilość znaków < 0, 255 > )
lub
string [
ilosc
]
( ilość znaków < 0, ilosc > )
•
Do znaków łańcucha odwołujemy się jak do elementów wektora poprzez indeksy
zaczynając od 1
•
Rozmiar łańcucha (liczbę znaków) można wyznaczyć za pomocą funkcji
length ( )
•
Łańcuchy można ze sobą łączyć za pomocą operatora
+
i porównywać operatorami
relacji
var imie : string [ 20 ];
...
Begin
...
imie := ’Kacper’;
writeln ( imie [1] );
// pierwsza litera
writeln ( imie [ length(imie)–1] );
// przedostatnia litera
end.
’K’ ’a’ ’c’ ’p’ ’e’ ’r’
1 2 3 4 5 6 7 20
imie[1]
imie[ length(imie)-1 ]
8
Przykład 1 – Plik jako zbiór znaków
Przykład 1 – Plik jako zbiór znaków
Dany jest plik ’znaki.txt’, zawierający ciąg znaków zakończony znakiem ’?’. Wydrukować
trzeci od końca znak, będący literą.
ALGORYTM
z3
z2
z1
z3
z2
z1
z
( gdy z jest literą )
program p1;
var
f
: text;
z,z1,z2,z3
: char;
begin
assign(f,’znaki.txt’);
reset(f);
z3:=‘ ‘; z2:=‘ ‘;
z1:=‘ ‘;
repeat
read(f,z);
if UpCase(z) in [’A’..’Z’] then begin z3:=z2; z2:=z1; z1:=z end
until z=’?’;
close(f);
writeln(z3)
end.
9
Przykład 2 – Plik jako zbiór wierszy
Przykład 2 – Plik jako zbiór wierszy
Z pliku o wczytanej nazwie przepisać do pliku ‘wyniki.pas’ 10 ostatnich wierszy.
program p2;
var
f
: text;
naz, s
: string;
a
:array[1..10] of string;
w, i
: integer;
begin
repeat
write(‘Podaj nazwę istniejącego pliku: ‘);
readln(naz);
until FileExists (naz);
{ FUNKCJA
FileExists
jest specyficzna dla Delphi –
przyjmuje wartość true, jeśli plik o nazwie podanej
w nawiasie istnieje, i false, jeśli nie ma takiego pliku. }
assign(f, naz);
reset(f);
w:=0;
for i:=1 to 10 do a[i]:=‘ ‘;
ALGORYTM
1
2
3
4
5
6
7
8
9
10
Uwaga: Jeśli jako nazwę pliku
podamy
‘con’
(konsola), to
wczytywanie będzie się
odbywać z klawiatury
(analogicznie zapis do pliku o
nazwie ‘con’ oznacza
wyświetlenie wyników na
ekranie).
W przypadku wczytywania z
klawiatury koniec danych
(eof...) sygnalizuje się
wciskając naraz klawisze
Ctrl-
Z
.
10
Przykład 2 – c.d.
Przykład 2 – c.d.
Z pliku o wczytanej nazwie przepisać do pliku ‘wyniki.pas’ 10 ostatnich wierszy.
while not eof(f) do begin
readln(f, s);
w:=w+1;
if w<=10 then a[w]:=s else begin
for i:=1 to 9 do a[i]:=a[i+1];
a[10]:=s
end
end;
close(f);
assign(f,’wyniki.pas’);
rewrite(f);
for i:=1 to 10 do writeln(f, a[i]);
close(f)
end.
ALGORYTM
1
2
3
4
5
6
7
8
9
10
11
Przykład 3 – Plik jako zbiór wartości liczbowych
Przykład 3 – Plik jako zbiór wartości liczbowych
Dany jest plik tekstowy, zawierajacy w
kazdym wierszu wspólrzedne (x,y)
punktów. Wydrukowac wspólrzedne i
odleglosc od poczatku ukladu
wspólrzednych 100-ego od konca punktu.
program p3;
Type Tpkt = record x,y : real end;
Var f : text;
bp : Tpkt;
a : array[1..100] of Tpkt;
w,k : integer;
naz : string;
begin
readln(naz);
assign(f,naz); reset(f);
w:=0; k:=1;
while not eof(f) do
begin
readln(f,bp.x,bp.y);
w:=w+1;
if w<=100 then a[w]:=bp else
begin
a[k]:=bp;
k:=k+1; if k>100 then k:=1
end
end;
close(f);
if w<100 then writeln(‘Brak 100 punktow’)
else with a[k] do
writeln(x,y,sqrt(sqr(x)+sqr(y)))
end.
100
1
2
3
.
.
.
.
.
.
.
ALGORYTM
Bufor cykliczny
wpisany punkt
100- ny od końca punkt