Pliki Dotychczas operowaliśmy danymi, które zapamiętywane były w

Transkrypt

Pliki Dotychczas operowaliśmy danymi, które zapamiętywane były w
Pliki
Dotychczas operowaliśmy danymi, które zapamiętywane były w pamięci operacyjnej
komputera (RAM). Program Turbo Pascal umożliwia zapisywanie i odczyt danych, co
zapewnia możliwość wielokrotnego ich wykorzystania. Zapamiętywanie danych odbywa
się w tzw. plikach danych.
Ze względu na typ zawartych w nich danych rozróżnia się trzy podstawowe rodzaje
plików:
•
pliki tekstowe zawierające informacje czytelne, składające się z tekstów;
•
pliki elementowe (zwane również zdefiniowanymi), których elementami są
najczęściej tablice, rekordy;
•
pliki beztypowe o nieokreślonej strukturze.
Pliki tekstowe
Pliki tekstowe zawierają informację niezakodowaną, bezpośrednio czytelną.
W bloku deklaracyjnym plikowi należy przydzielić jednoznaczną zmienną plikową.
Deklaracja zmiennej plikowej dla pliku tekstowego:
VAR
Nazwa_pliku : Text;
Nazwa_pliku jest nazwą zmiennej plikowej.
Zanim zostaną wykonane operacje na tekście zawartym w pliku na dysku należy najpierw
przyporządkować
nazwę
pliku
dyskowego
do
konkretnej
zmiennej
plikowej
wykorzystywanej w programie.
Do tego celu służy procedura standardowa ASSIGN. Wywołuje się ją tworząc zapis w
postaci:
ASSIGN (Nazwa_pliku, Nazwa_pliku_dyskowego);
gdzie
Nazwa_pliku jest nazwą zmiennej plikowej w programie, zaś Nazwa_pliku_ dyskowego
jest nazwą rzeczywistą pliku na dysku.
Następnie należy otworzyć plik za pomocą jednej ze standardowych procedur
RESET, REWRITE lub APPEND. Odpowiednie zapisy tych procedur dla otwarcia pliku
mają postać:
RESET (Nazwa_pliku); lub
REWRITE (Nazwa_pliku); lub
APPEND (Nazwa_pliku);
Procedura RESET otwiera tylko już istniejący plik. Natomiast procedura REWRITE
otwiera nie tylko nowy plik, ale również plik istniejący. W tym drugim przypadku powoduje
to skasowanie zapisu danych w tym pliku.
Procedura APPEND powoduje otwarcie pliku wyłącznie do zapisu. Dane będą
dopisywane na koniec pliku.
Do zamykania pliku stosuje się procedurę CLOSE w postaci:
CLOSE (Nazwa_pliku);
Zapisywanie i odczytywanie danych z plików tekstowych dokonuje się za pomocą
instrukcji
Read,
Readln,
Write
i
Writeln
uzupełnionych
o
Nazwa_pliku
i
Lista_argumentów. Po tej zmianie postać instrukcji jest następująca:
Read (Nazwapliku, Lista_argumentów);
Write (Nazwa_pliku, Listaargumentów);
Przy wykorzystaniu funkcji Eof można określić, czy plik znajduje się w pozycji końcowej,
tj. przed ostatnim znakiem (Ctrl-Z). Natomiast przy wykorzystaniu funkcji Eoln można
określić, czy plik tekstowy znajduje się w pozycji końca wiersza. Obie te funkcje stosuje
się w konstrukcji do czytania pliku „znak po znaku":
VAR
F
: Text;
CH : CHAR;
………………..
RESET (F);
WHILE NOT Eof(F) DO
BEGIN
WHILE NOT Eoln(F) DO
Read(F, CH);
Readln(F)
END;
Do czytania pliku „wierszowo" można natomiast zastosować sekwencję:
VAR
F
: Text;
S
: STRING;
……………………………
RESET (F);
WHILE NOT Eof(F) DO
Read(F, S);
Należy pamiętać, że przejścia do kolejnego wiersza w trakcie zapisu/odczytu dokonać
można jedynie za pomocą Writeln i Readln.
Ćwiczenie 111
Napisać program pozwalający zapisywać i odczytywać dane z pliku tekstowego. Do pliku
należy wpisać liczby naturalne od 10 do 30. Program ma tytuł „Plik_tekstowy". Zapisać
program na dysku w pliku txt_1.pas.
W naszym programie przyjmuje się następujące oznaczenia:
•
f - zmienna plikowa,
•
Liczby.dan - nazwa pliku dyskowego.
Załóżmy, że plik nie istnieje na dysku. Do pliku dyskowego należy zapisać liczby
naturalne od 10 do 30.
W bloku deklaracyjnym należy zadeklarować zmienną plikową f w postaci zapisu:
f : TEXT;
co oznacza, że plik jest plikiem tekstowym.
Następnie należy skojarzyć zmienną plikową f z nazwą konkretnego pliku dyskowego
Liczby.dan. Skojarzenie to będzie miało postać:
ASSIGN (f, Liczby.dan);
Zakładając, że plik uprzednio nie istniał, do utworzenia i jednocześnie otwarcia pliku
należy skorzystać z procedury REWRITE w postaci zapisu
REWRITE ( f ) ;
Następnie należy do pliku zapisać liczby naturalne. Uzyskuje się to korzystając z
poniższej konstrukcji:
FOR i:=10 TO 30 DO Write (f, i:4);
Instrukcja Write jest wzbogacona o zmienną plikową i ma postać:
Write (f, i:4);
Po zapisaniu danych należy zamknąć plik przez podanie CLOSE ( f).
Liczby są więc zapisane w pliku dyskowym Liczby.dan znajdującym się na dysku.
Pozostaje już tylko odczytać zawartość pliku.
Ponieważ plik istnieje, do jego otwarcia należy wybrać procedurę RESET.
Otwarcie pliku do odczytu ma postać: RESET ( f ) ;
Odczytanie zawartości pliku umożliwi poniższa sekwencja:
WHILE NOT Eof(f) DO
BEGIN
Read (f, i);
Write (i:5);
END;
Instrukcja Read jest wzbogacona o zmienną plikową i ma postać:
Read (f, i);
Po odczytaniu danych należy zamknąć plik przez podanie CLOSE ( f).
Cały program został przedstawiony poniżej:
PROGRAM Plik_tekstowy;
USES Crt;
VAR
f
: TEXT; (* zmienna plikowa *)
i
: INTEGER;
(******************************)
BEGIN
ClrScr;
ASSIGN (f, 'Liczby.dan');
(* skojarzenie nazwy zmiennej plikowej ' f'
z rzeczywista nazwa pliku na dysku Liczby.dan *)
REWRITE(f);
(* otwarcie pliku - zakładamy, ze nie istniał on uprzednio *)
FOR i:=10 TO 30 DO
Write (f, i:4);
(* zapisanie liczby do pliku *)
CLOSE (f);
(* zamkniecie dostępu do pliku *)
Writeln (' Plik "Liczby.dan" zawiera liczby od 10 do 30 co l');
REPEAT UNTIL KeyPressed;
Writeln;
Writeln (' Odczytanie pliku Liczby.dan ');
Writeln;
RESET (f); (* otwarcie pliku juz istniejącego *)
WHILE NOT Eof(f) DO
BEGIN
Read (f, i);
(* czytanie liczb z pliku *)
Write (i:5); (* wyświetlanie liczby *)
END;
CLOSE (f) (* zamkniecie dostępu do pliku *)
END.
Ćwiczenie 112
Napisać program kopiujący zawartość jednego pliku tekstowego linia po linii do drugiego
pliku tekstowego i dopisujący go na końcu istniejącego tekstu. Program ma tytuł
„Plik_kopiujacy_liniami". Zapisać program na dysku w pliku o nazwie txt_2.pas.
W programie wykorzystano procedurę APPEND otwierającą istniejący plik naz_2 i
dopisującą dane na koniec tego pliku. Funkcja Eof podaje wartość TRUE, jeśli napotka
koniec pliku.
PROGRAM Plik_kopiujacy_liniami;
(* kopiowanie danych tekstowych *)
USES CrtVAR
pierwszy, drugi : Text;
linia
naz_1, naz_2
: STRING[70];
: STRING[20];
(************************************************)
PROCEDURE Kopiuj(naz_1, naz_2 : STRING);
BEGIN
ASSIGN (pierwszy, n a z _ 1 ) ;
RESET (pierwszy);
ASSIGN (drugi,naz_2);
APPEND (drugi);
WHILE NOT Eof (pierwszy) DO
BEGIN
Readln
(pierwszy,linia);
Writeln (drugi,linia);
END;
CLOSE (pierwszy);
CLOSE (drugi);
Writeln (' Skopiowano zawartość pliku: ',naz_1,' do pliku: ',naz_2);
END;
(*******************************************)
BEGIN
ClrScr;
Writeln (' Kopiowanie danych tekstowych');
Writeln (' z pliku wejściowego i dopisywanie ich ');
Writeln (' na końcu tekstu pliku wyjściowego ');
Writeln;
Write (' Podaj nazwę pliku wejściowego ...: ');
Readln (naz_1);
Write (' Podaj nazwę pliku wyjściowego ...: ');
Readln (naz_2);
Kopiuj (naz_1, naz_2);
END.
Ćwiczenie 113
Napisać program pozwalający kopiować zawartość jednego pliku tekstowego znak po
znaku do drugiego pliku tekstowego. Program ma tytuł „Plik_kopiujacy_znakami".
Zapisać program na. dysku w pliku txt_3.pas.
Ćwiczenie 114
Napisać program tworzący na dysku plik tekstowy oraz umożliwiający odczytanie
wprowadzonego do niego tekstu. Do pliku należy wpisać dowolny tekst. Program ma tytuł
„Zakładanie_pliku_tekstowego". Program wykorzystuje wyłączanie dyrektywy kompilatora
(*$I-*) oraz jej włączanie (*$I+*). Zapisać program na dysku w pliku txt_4.pas.
W jednym z poprzednich ćwiczeń powstał program również zakładający plik tekstowy na
dysku, ale do niego zostały wprowadzone dane w postaci ciągu liczbowego. Teraz
należy napisać program umożliwiający wprowadzenie do niego tekstu. Program
wykorzystuje wyłączanie dyrektywy kompilatora (*$I-*) oraz jej włączanie (*$I+*).
Zmienna tekst kończy zapisywanie tekstu z chwilą wypisania ' *** '.
Przy korzystaniu z procedury RESET w przypadku podania nieprawidłowej ścieżki
dostępu do pliku (lub gdy plik nie istnieje), program zostaje przerwany z sygnalizacją
błędu (błąd 2 - nie znaleziono pliku).
Tym niepożądanym przerywaniom wykonywania programów można zapobiec stosując
standardową funkcję IOResult.
Dyrektywą kompilatora (*$I-*) wyłącza się kontrolę wykonywania operacji wejścia wyjścia. Oczywiście w przypadku wystąpienia błędu program będzie dalej wykonywany,
co zostanie wychwycone przez funkcję IOResult.
Dyrektywa kompilatora (*$I+*) włącza na nowo kontrolę przy każdej operacji we/wy.
W poniższym programie FUNCTION Istnieje_plik sprawdza, czy istnieje plik o nazwie,
która ma zostać przydzielona nowemu plikowi i informuje o wyniku sprawdzenia. Jeśli plik
nie istnieje, to poleca go najpierw utworzyć. Jeśli zaś plik istnieje, informuje o możliwości
utraty jego danych w przypadku jego ponownego „utworzenia" wraz z otwarciem. Dzięki
wyłączonemu systemowi kontroli nie ma przerwania pracy programu. W programie
uzyskano sygnał dźwiękowy dzięki wprowadzeniu znaku #7.
Cały program został przedstawiony poniżej:
PROGRAM Zakladanie_pliku_tekstowego;
USES Crt;
VAR
f
: Text;
z
: CHAR;
n_plik
: STRING[30];
tekst
: STRING[80];
Nowy_plik
: Boolean;
Wybrany_klawisz : CHAR;
TYPE
Dostep
= STRING[40];
(******************************************************)
(* sprawdzenie czy plik juz istnieje *)
FUNCTION Istnieje_plik (Nazwa_pliku : Dostęp): Boolean;
BEGIN
(*$I-*)
(* wyłączenie systemu kontrolnego *)
Assign(f, Nazwa_pliku);
Reset (f);
(*$I+*)
(* uruchomienie systemu kontrolnego *)
IF IOResult = 0 THEN
BEGIN
(* plik istnieje ! *)
Close (f);
Istnieje _ p l i k := TRUE
END
ELSE
(* plik jeszcze nie istnieje ! *)
Istniej e_plik := FALSE
END;
(****************************************************)
BEGIN
CIrScr;
Writeln;
Nowy_plik := TRUE;
Writeln (' Zakładanie pliku tekstowego ');
Writeln;
Write (' Podaj nazwę zakładanego pliku ....: ');
Writeln;
Write (' ( Nie podasz - nazwa domyślna pliku :)');
Writeln (' t x t _ 1 . d a n ');
Writeln;
Write (' Nazwa pliku ....: ');
Readln (n_plik);
Writeln;
IF LENGTH (n_plik)=0 THEN
n_plik:= 'text_1.dan';
IF Istnieje_plik ( n _ p l i k ) THEN
BEGIN
(* plik istnieje - to czy zastąpić go nowym ? *)
Writeln;
Writeln (' Uwaga!!!*);
Writeln (' Plik istnieje – ‘, #7#7#7,' Wszystkie ',+ ' dotychczasowe dane zostaną
usunięte z pliku !');
Writeln;
REPEAT
Write (' Wykonywać dalej ? (T)ak / (N)ie : ');
Readln (Wybrany_klawisz);
UNTIL Wybrany_klawisz IN ['T',’t',’N',’n'];
IF Wybrany_klawisz IN ['N',’n’] THEN
Nowy_plik := FALSE (* nie tworzyć nowego pliku ! *)
END;
Writeln;
IF Nowy_plik THEN
BEGIN
(* tworzenie nowego pliku *)
ClrScr;
ASSIGN (f, n_plik);
REWRITE (f);
Writeln (' Nowo utworzony plik nosi nazwę....: ', n_plik );
Writeln;
Writeln ('
Pisz tekst w każdym wierszu co najwyżej 70 znaków ');
Writeln;
Writeln (' Gdy koniec tekstu wciśnij < ENTER >,');
Writeln (' wpisz < *** > i ponownie wciśnij < ENTER >');
Writeln;
Writeln;
Readln (tekst);
WHILE tekst<>’****' DO
BEGIN
Writeln (f, tekst);
Readln (tekst);
END;
CLOSE (f);
ClrScr;
Writeln;
Writeln (' Odczytanie tekstu z pliku ‘,n_plik );
Writeln;
RESET(f);
WHILE NOT Eof(f) DO
BEGIN
Readln (f, tekst);
Writeln (tekst);
END;
REPEAT UNTIL KeyPressed;
CLOSE (f);
ClrScr;
Write (' Nacisnij dowolny klawisz ');
WHILE Keypressed DO z:=Readkey;
END;
END.
Ćwiczenie 115
Napisać program obliczający liczbę stów w pliku tekstowym. Program ma tytuł
„Obliczanie_liczby_slow". Zapisać program na dysku w pliku txt_5.pas.
Uwaga:
Zakładamy, że poszczególne słowa w pliku tekstowym są oddzielone znakiem spacji,
tabulacji lub końcem linii. Między słowami występuje tylko jedna spacja.
Ćwiczenie 116
Napisać program pozwalający drukować linię tekstu w kolejności odwrotnej. Program ma
tytuł „Linia_odwrotnie". Zapisać program na dysku w pliku o nazwie txt_6.pas.
Ćwiczenie 117
Napisać program porównujący dwa pliki tekstowe. Program ma tytuł „Porównywanie_
plików _txt". Zapisać program na dysku w pliku txt_7.pas.
Uwaga:
W programie sprawdza się równość znaków do końca krótszego pliku. W przypadku
pozytywnego wyniku sprawdzamy długość plików.
Ćwiczenie 118 .
Napisać program wyświetlający na ekranie zawartość pliku tekstowego. Podczas
wyświetlania będzie możliwość przewijania o jedną linię w dół lub w górę. Program ma
tytuł „Przewijanie_plikujxt". Zapisać program na dysku w pliku txt_8.pas.
Ćwiczenie 119
Napisać program wyszukujący w pliku tekstowym pytania, które następnie są
wyświetlane na ekranie. Program ma tytuł „Szukanie_pytan". Zapisać program na dysku
w pliku txt_9.pas.
Ćwiczenie 120
Napisać program wyświetlający na ekranie zawartości pliku tekstowego, poczynając od
wskazanej linii. Naciśnięcie klawisza Esc powinno kończyć wyświetlanie tekstu. Program
ma tytuł „Wyświetlanie_tekstu_od_linii". Zapisać program na dysku w pliku txt_10.pas.
Ćwiczenie 121
Napisać program usuwający z pliku tekstowego wszystkie nieparzyste słowa. Program
ma tytuł „Usuwamy_nieparzyste_slowa". Zapisać program na dysku w pliku txt_11.pas.
Pliki elementowe
Pliki elementowe (zwane również zdefiniowanymi) są to pliki, w których przechowywana
informacja występuje w postaci zakodowanej. Nie ma więc możliwości bezpośredniego
ich odczytania.
Deklaracja zmiennej plikowej:
Nazwa_pliku : FILE OF Typ_złożony
Nazwa_pliku jest nazwą zmiennej plikowej, zaś Typ_złożony jest typem prostym lub
strukturalnym.
Przyporządkowania nazwy pliku dyskowego do danej zmiennej plikowej dokonuje się za
pomocą procedury ASSIGN (podobnie jak dla plików tekstowych). Do otwierania plików
wykorzystuje się procedury RESET i REWRITE (bez APPEND). Plik zamyka się za
pomocą procedury CLOSE
Ćwiczenie 122
Napisać program pozwalający zapisywać dane do pliku elementowego w postaci ciągu
liczb rzeczywistych od -10 do 10 z krokiem 0.5. Program ma tytuł „Plik_elementowy".
Zapisać program na dysku w pliku elem_1l.pas.
Cały program został przedstawiony poniżej:
PROGRAM Plik_elementowy;
USES Crt;
VAR
x
: REAL;
f
: FILE OF REAL;
nazwa
: STRING[30];
Wybrany_klawisz
: CHAR;
Istnieje _ p l i k : Boolean;
(********************************************************)
BEGIN
ClrScr;
Writeln (' Zakładanie pliku elementowego na dysku’);
Writeln (' i wprowadzenie do niego liczb rzeczywistych');
Istnieje plik := TRUE;
Writeln;
Writeln (' Podaj nazwę pliku ....:');
Write ('( Nie podasz - nazwa domyślna pliku :)');
Writeln (' rzecz_1.dan ');
Readln (nazwa);
Writeln;
IF LENGTH (nazwa)=0 THEN nazwa: = 'rzecz_1.dan';
ASSIGN (f, nazwa);
{$1-}
RESET (f);
{$1+}
IF IOResult = 0 THEN
BEGIN
(* plik istnieje - to czy zastąpić go nowym ? *)
Writeln (‘Uwaga!!!');
Writeln (' Plik istnieje - ',#7#7#7,' Wszystkie ',+ 'dotychczasowe
dane zostaną usunięte z pliku !');
Writeln;
REPEAT
Write (‘Wykonywać dalej ? (T)ak / (N)ie : ');
ReadLn(Wybrany_klawisz);
UNTIL Wybrany klawisz IN ['T',’t',’N',’n'];
IF Wybrany_klawisz IN ['N',’n'] THEN
Istnieje_plik := FALSE (* nie tworzyć nowego pliku ! *)
END;
Writeln;
IF Istnieje_plik THEN
BEGIN
(* tworzenie nowego pliku *)
ASSIGN (f, nazwa);
REWRITE (f);
x:=-10.0;
WHILE x<=10.0 DO
BEGIN
Write (f, x);
x:=x+0.5
END;
CLOSE (f);
Writeln;
Writeln (' Nowo utworzony plik nosi nazwę : ',nazwa );
Writeln;
Readln;
END;
END.
Ćwiczenie 123
Napisać program pozwalający wyznaczyć liczbę elementów w pliku elementowym.
Program ma tytuł „Wyznaczenie_liczby_elementow_w_pliku". Zapisać program na dysku
w pliku elem_2.pas.
W programie wykorzystamy wcześniej poznaną konstrukcję, dostosowaną do wymagań
zadania, do czytania pliku „znak po znaku":
WHILE NOT Eof(f) DO
BEGIN
Read (f, x);
ile:=ile+1;
END;
Czytanie pliku zostaje zakończone po przeczytaniu ostatniego elementu, a następnie
zostaje wyświetlona zawartość licznika ile.
Cały program został przedstawiony poniżej:
PROGRAM Wyznaczenie_liczby_elementow_w_pliku;
USES Crt;
VAR
ile
: INTEGER;
x
: REAL;
f
: FILE OF REAL;
nazwa
(* ile elementów w pliku *)
: STRING;
(**************************************)
BEGIN
ClrScr;
Writeln (' Wyznaczenie liczby elementów w pliku');
Writeln;
Write (' Podaj nazwę pliku z danymi: ');
Readln (nazwa);
IF LENGTH (nazwa) =0 THEN nazwa:= 'rzecz_1.dan';
ASSIGN (f, nazwa);
RESET (f);
ile:=0;
WHILE NOT Eof(f) DO
BEGIN
Read (f, x);
ile:=ile+1;
END;
CLOSE(f);
(* zamknij plik*)
Writeln;
Writeln ('W pliku :',nazwa,' jest ',ile,' liczb rzeczywistych');
Readln;
END.
Ćwiczenie 124
Napisać program pozwalający odczytać dane z pliku elementowego zawierającego ciąg
liczb rzeczywistych. Program ma tytuł „OdczytanieJiczb_rzeczywistych"'. Zapisać
program na dysku w pliku elem_3.pas.
Ćwiczenie 125
Napisać program pozwalający wyznaczyć maksymalną i minimalną liczbę w pliku
elementowym zawierającym liczby rzeczywiste. Program ma tytuł „Liczby_max_i_min".
Zapisać program na dysku w pliku elem_4.pas.
Ćwiczenie 126
Napisać program kopiujący plik elementowy zawierający liczby rzeczywiste. Program ma
tytuł „Kopiowanie_pliku". Zapisać program na dysku w pliku elem_5.pas.
Ćwiczenie 127
Napisać program pozwalający na utworzenie pliku elementowego przechowującego
tablicę. Program ma tytuł „Tablica_w_pliku". Zapisać program na dysku w pliku
elem_6.pas.
Operacje na plikach elementowych
Do wyboru określonego elementu z pliku elementowego służy tzw. wskaźnik pliku. Do
ustawiania tego wskaźnika pliku na określonym elemencie służy procedura SEEK.
Należy pamiętać, że elementy są numerowane od zera.
Zapis procedury SEEK ma postać:
SEEK (VAR f, poz: LONGINT);
Przykładowy zapis:
SEEK (f_1, 5);
oznacza ustawienie wskaźnika pliku w pliku identyfikowalnym zmienną plikową f_1 na
pozycji 6 (5+1).
W celu określenia pozycji wskaźnika pliku w pliku identyfikowalnym zmienną plikową f
stosuje się funkcję FilePos.
Zapis funkcji FilePos ma postać:
FilePos (VAR f) : LONGINT;
Przykładowy zapis: Poz:=FilePos ( f_l);
Przy określaniu liczby elementów w pliku identyfikowalnym zmienną plikową f pliku
stosujemy funkcję FileSize.
Zapis funkcji FileSize ma postać:
FileSize (VAR f) : LONGINT;
Przykładowy zapis:
liczba :=FileSize (f_l );
Jeśli plik jest pusty to podawana jest wartość zero.
Ćwiczenie 128
Napisać program pozwalający zapisywać dane do pliku elementowego w postaci ciągu
liczb naturalnych od 1 do 10. Następnie zmienić wartość 3. elementu z tego ciągu.
Program ma tytuł „Zmiana _w artosci". Zapisać program na dysku w pliku elem_7.pas.
W pierwszej części programu liczby ciągu (elementy) wraz z ich numerem pozycji
zostają zapisane do pliku. Dla zapisu pozycji liczb oraz ich wartości wykorzystuje się
jedną zmienną, tj. x.
Następnie ustawić należy wskaźnik pliku na 2. pozycji (Uwaga: pozycje numerowane są
od 0), tj. na 3. elemencie, co przedstawia poniższy zapis:
SEEK (f, 2);
Przy ustawionej pozycji można dokonać odpowiedniej zmiany wartości tego elementu
korzystając z instrukcji podstawienia:
x:=23;
Następnie w pliku zostaje dokonany zapis nowej wartości elementu.
Write (f, x);
Przed odczytaniem zawartości pliku wskaźnik pliku zostaje ustawiony na pierwszym
elemencie:
SEEK (f, 0);
Do odczytania elementów pliku należy skorzystać z instrukcji FOR oraz dwóch
zmiennych x i y. Wartość x określa numer pozycji elementu (liczby), zaś y wartość
elementu położonego na tej pozycji.
Sekwencja odczytująca elementy pliku ma postaci:
FOR x:=l TO 10 DO
BEGIN
Read (f, y);
Writeln (' ‘,x:2,' – ‘y:2);
END;
Cały program został przedstawiony poniżej:
PROGRAM Zmiana_wartosci;
USES Crt;
VAR
f
: FILE OF INTEGER;
x
: INTEGER;
y
: INTEGER;
ch : CHAR;
(***************************************)
BEGIN
ClrScr;
ASSIGN (f, 'plik.dok');
REWRITE (f);
Writeln (' Zmiana wartości elementu');
Writeln (' Poz. Wartość ');
FOR x:=1 TO 10 DO
BEGIN
Write (f, x);
Writeln (' ‘,x:2,' - ', x:2);
END;
Writeln; (* wprowadzamy zmianę w 3. elemencie *)
SEEK (f, 2); (* ustawienie wskaźnika na 3. elemencie *)
x:=23;
(* ustawienie nowej wartości *)
Write (f, x);
(* zapisanie do pliku *)
SEEK (f, 0);
(* ustawienie wskaźnika na pierwszym elemencie *)
Writeln (' Po zmianie wartości na pozycji 3.');
FOR x:=1 TO 10 DO
BEGIN
Read (f, y);
Writeln (' ',x:2,' - ', y:2);
END;
ch:=Readkey;
END.
Ćwiczenie 129
Napisać program pozwalający na utworzenie pliku elementowego przechowującego
tablicę jednowymiarową. Zapisać do tablicy 10 liczb rzeczywistych. Następnie zmienić
wartość 4. i 7. elementu w ten sposób, ze ich nowe wartości są dwukrotnie większe od
poprzednich. Program ma tytuł „Zmiana_w_tablicy". Zapisać program na dysku w pliku
elem_8.pas.

Podobne dokumenty