PODST AWY PROGRAM OWANIA
Pliki elementowe cz. 1
1
Pliki elementowe (zdefiniowane) są to pliki, w których przechowywane informacje są przedstawione w postaci
zakodowanej niemożliwej do bezpośredniego odczytania. Zasady obsługi pliku elementowego są takie same jak
dla pliku tekstowego. Dostęp do pliku jest sekwencyjny, tzn. dostępny jest tylko jeden element określony przez
aktualne położenie wskaźnika, zaś inne elementy mogą być udostępniane tylko po wykonaniu pewnych operacji
na pliku (np. przesuwanie wskaźnika). Rozmiar pliku jest dynamiczny. Zmienną typu plikowego można kojarzyć
kolejno z różnymi plikami dyskowymi. Deklaracja zmiennej plikowej ma postać:
var nazwa zmiennej plikowej: file of
typ składowy
Typ składowy nie może być typem plikowym i wskaźnikowym.
Podobnie jak dla plików tekstowych przyporządkowanie nazwy pliku dyskowego do zmiennej plikowej
dokonuje się przy pomocy procedury
assign
, otwieranie pliku dokonuje się przy pomocy procedur
rewrite
(do zapisu) i
reset
(do odczytu i zapisu), a zamykanie przy pomocy procedury
close
. Dla plików
elementowych nie można użyć procedury
append
.
Czytanie z pliku odbywa się przy pomocy procedury
read
, a zapisywanie do pliku przy pomocy procedury
write
, mają one następującą postać:
read(zmienna plikwa, lista zmiennych typu bazowego)
write(zmienna plikowa, wyr
ażenie typu bazowego)
Dla plików elementowych nie można używać procedur
readln
i
writeln
.
Procedury pomocnicze
•
seek(zmienna plikowa, pozycja)
– ustawia wskaźnik pliku przed elementem o numerze pozycja
•
truncate(zmienna plikowa)
– kasuje plik od pozycji bieżącej do końca
Funkcje pomocnicze
•
filesize(zmienna plikowa)
– podaje liczbę elementów pliku
•
filepos(zmienna plikowa)
– podaje pozycję elementu bieżącego
Ćwiczenie 1
Napisz program, który:
−
tworzy na dysku w katalogu bieżącym dwa pliki elementowe: do jednego zapisuje 100 losowych liczb
całkowitych, do drugiego zapisuje 100 losowych liczb rzeczywistych.
−
Wyświetla oba pliki.
program pliki1_e;
uses crt;
const n = 100;
var fcal: file of integer;
frzecz: file of real;
i, m : integer;
x, y : real;
begin
clrscr;
assign(fcal, 'pcal');
rewrite(fcal);
assign(frzecz, 'przecz');
rewrite(frzecz);
{zapisywanie do plikow}
randomize;
for i := 1 to n do
begin
m := random(100);
write(fcal, m);
x := random(100) * 0.25;
write(frzecz, x);
PODST AWY PROGRAM OWANIA
Pliki elementowe cz. 1
2
end;
close(fcal);
close(frzecz);
{odczytywanie z plikow}
reset(fcal);
writeln('liczby calkowite');
while not eof(fcal) do
begin
read(fcal, m);
write(m:3);
end;
writeln;
writeln('liczby rzeczywiste');
reset (frzecz);
while not eof(frzecz) do
begin
read(frzecz, x);
write(x:5:1);
end;
close(fcal);
close(frzecz);
readln;
end.
Ćwiczenie 2
Napisz program, który otworzy do odczytu plik zawierający liczby całkowite i wyświetli jego zawartość.
Na końcu programu dopisz poniższy ciag instrukcji.
reset(fcal);
writeln('liczby calkowite');
for i := 1 to 10 do
begin
write('filepos' ,filepos(fcal):4);
write ('filesize ', filesize(fcal):4);
read(fcal, m);
writeln(m:4);
end;
seek(fcal, 5);
read(fcal, m);
writeln(' seek 5 ', m);
seek(fcal, 100); {1}
read(fcal, m); {disk read error}
writeln(m:4);
close(fcal);
•
Zastąp instrukcję oznaczoną {1} instrukcją:
seek(fcal, filesize(fcal));
•
Wytłumacz uzyskany efekt.
Uwagi:
Po otwarciu pliku funkcja
filepos
przyjmuje wartość 0, po zapisaniu pierwszego elementu zmienia
wartość na 1 itd.. Elementy w pliku są, więc numerowane od 0.
Funkcja
filesize
zawsze pokazuje liczbę elementów w pliku.
Instrukcja oznaczona {1} ustawia wskaźnik pliku po 100 (ostatnim) elemencie, dlatego kolejna instrukcja
czytania próbuje czytać poza końcem pliku i powoduje błąd.
Liczbę 100 w instrukcji {1} możemy zastąpić wartością funkcji
filesize
, (najczęściej jest to konieczne,
bo nie znamy dokładnej liczby elementów w pliku).
PODST AWY PROGRAM OWANIA
Pliki elementowe cz. 1
3
•
Zastąp instrukcję {1} instrukcją:
seek(fcal, 99);
a następnie instrukcją:
seek(fcal, filesize(fcal) - 1);
W obu przypadkach program zakończy się poprawnie i zostanie odczytany z pliku ostatni element.
Ćwiczenie 3
Usuń z pliku 10 ostatnich liczb i ponownie wyświetl plik.
Następnie ustaw wskaźnik pliku na końcu i dopisz 10 innych liczb losowych z zakresu (100, 200).
{usunięcie
ostatnich 10 elementów z pliku}
reset(fcal);
seek(fcal, 89);
truncate(fcal);
close(fcal);
{dopisanie elementów na końcu pliku}
reset(fcal);
seek(fcal, filesize(fcal));
for i := 1 to 10 do
begin
m := random(100) + 100;
write(fcal, m);
end;
close(fcal);
Ćwiczenie 4
Napisz procedurę, która skopiuje plik zawierający liczby rzeczywiste do innego pliku pomijając podczas
kopiowania wszystkie liczby większe od zadanej liczby i policzy ile takich liczb było w pliku wejściowym.
Zastosuj procedurę do skopiowania pliku przecz z pominięciem liczb większych od 20.
Ćwiczenie 5
1. Napisz funkcję, która wyznaczy największą liczbę w pliku.
2. Napisz funkcję, która wyznaczy liczbę najmniejszą w pliku.
3. Napisz funkcję, która obliczy sumę wszystkich elementów w pliku. Zastosuj tę funkcję w programie,
w którym z pliku wejściowego zawierającego liczby, utworzysz drugi plik, do którego zapiszesz tylko tyle
liczb z pliku pierwszego, aby ich suma nie przekroczyła określonej liczby. Zastosuj te funkcje w programie,
w którym w pliku wejściowym zostanie tylko tyle elementów, żeby ich suma nie przekroczyła zadanej
liczby.
4. Napisz program, który będzie realizował menu:
Operacje na plikach zawierających liczby:
1.
Zakładanie pliku
2.
Dopisanie liczb na końcu pliku
3. Usuwanie z pliku wybranych liczb
4. Obliczanie liczby elementów w pliku
5. Obliczanie sumy elementów w pliku
6. Obcinanie pliku do zdanej liczby elementów
7. Obcinanie pliku do zadanej sumy elementów
8.
Wyświetlanie pliku
9. Koniec
Wybierz opcję:
Wszystkie opcje zrealizuj w postaci funkcji lub procedur.