Pliki elementowe cz. 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, wyraż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);
1
Pliki elementowe cz. 1
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).
2
Pliki elementowe cz. 1
• 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.
3