Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Записи.doc
Скачиваний:
7
Добавлен:
01.12.2018
Размер:
240.64 Кб
Скачать

5.2. Робота з типізованими файлами

5.2.1. Поняття типізованого файлу

Типізований файл представляє собою послідовність компонент будь-якого вказаного типу даних, окрім файлового та об’єктного типів даних.

Загальний опис декларації файлової змінної для роботи з типізованими файлами:

<ім’я файлової змінної> : file of <тип компоненти>;

Наприклад:

type

TPerson = record {Тип «запис» для опису даних про людину}

Surname, Name : String; {Прізвище, ім’я}

Year : Word; {Вік}

end;

var

{опис файлових змінних для роботи з типізованими файлами}

F1 : file of integer; {компонент файлу – ціле число}

F2 : file of char; {компонент файлу – символ}

F3 : file of TPerson; {компонент файлу – тип «Запис:

дані про людину» }

Розмір всіх компонентів типізованого файлу строго постійна і визначається розміром (кількість байт) типу компоненти. Це надає можливість організувати прямий доступ до кожної компоненти типізованого файлу.

До виконання першої операції читання/запису даних з/в типізований файл файловий вказівник знаходиться на початку файлу та вказує на компонент з номером 0. Після кожної операції читання/запису файловий вказівник переміщається до наступного компоненту файлу.

5.2.2. Основні підпрограми для обробки типізованих файлів

Процедура READ дозволяє виконати операцію читання (вводу) компоненту з файлу:

Procedure READ (<ф.з.>,<список вводу>);

де

ф.з.файлова змінна;

список вводу – це список, що містить одну чи більше змінних такого ж типу даних, що і компоненти типізованого файлу.

Файлова змінна повинна бути описана як FILE OF <тип компоненти> та пов’язана з фізичним файлом за допомогою процедури ASSIGN. Для відкриття файлу слід використати процедуру RESET. Якщо файл закінчився, то звернення до процедури READ викличе помилку операції вводу/виводу.

Після кожного читання компоненти з файлу файловий вказівник переміщується на наступний компонент в файлі.

Процедура WRITE використовується для операції запису(виводу) даних у файл:

Procedure WRITE (<ф.з.>,<список виводу>);

список виводу – це список, що містить одну чи більше виразів (змінних) того ж типу, що і компоненти типізованого файлу.

Після кожної операції запису компоненти у файл файловий вказівник переміщується і вказує на наступний компонент в файлі чи на кінець файлу.

Процедура SEEK переміщає файловий вказівник на компонент, номер якого вказується другим параметром цієї процедури:

Procedure SEEK (<ф.з>,<N компоненту> );

N компоненту – вираз типу LONGINT, значення якого вказує на номер компонента файлу до якого слід перемістити файловий вказівник. Перший компонент файлу має номер 0.

Функція FILESIZE повертає значення типу LONGINT, яке містить кількість компонентів у файлі:

Function FILESIZE (<ф.з>) : Longint;

Наприклад, для переміщення файлового вказівника вкінець файлу можна записати:

Var

F : file of word;

Begin

...

seek(f, FileSize(f)); 

...

End.

Функція FILEPOS повертає значення типу LONGINT, яке містить порядковий номер компоненту файлу, який буде оброблятися наступною операцією вводу/виводу:

Function FILEPOS (<ф.з.>) : Longint;

Приклад, написати програму для обробки послідовності дійсних чисел. Передбачити підпрограми для ввода/виводу чисел з/у типізований файл, друку послідовності чисел на екран монітора в прямому та оберненому порядках. Текст програми наведено нижче.

program typefile;

uses crt;

var

f : file of real; {файлова змінна для роботи з типізованим файлом}

{Процедура SaveToFile призначена для вводу чисел з клавіатури та збереження їх у файл.

Користувач задає кількість чисел n, що потрібно ввести. Потім вводить n чисел.}

procedure SaveToFile;

var

a : real; {число для вводу}

n,i : integer; {кількість чисел, номер числа}

begin

rewrite(f); {відкриття файлу для запису}

write('Кiлькiсть чисел для вводу =>');

readln(n);

for i:=1 to n do {цикл вводу з клавіатури та збереження n чисел}

begin

readln(a);

write(f,a); {запис числа а у файл}

end;

close(f); {закриття файлу}

end;

{Процедура LoadFromFile призначена для читання з файлу чисел та виводу їх на екран монітора.}

procedure LoadFromFile;

var

a : real; {число з файлу}

i : integer; {номер числа}

begin

{I-}

reset(f); {відкриття файлу для читання даних з нього}

{I+}

if (IOResult=0) then {перевірка: чи відкрито файл}

begin

for i:=0 to FileSize(f)-1 do {цикл читання чисел з файлу. Кількість чисел у

файлі визначається за допомогою функції FileSize }

begin

read(f,a); {читання числа з файлу}

write(a:8:2); {вивід числа на екран монітора}

end;

close(f); {закриття файлу}

writeln;

end;

end;

{Процедура LoadFromFileReverse призначена для читання з файлу чисел в оберненому порядку (з кінця до початку файлу) та виводу їх на екран монітора.}

procedure LoadFromFileReverse;

var

a : real; {число з файлу}

i : integer; {номер числа}

begin

{I-}

reset(f); {відкриття файлу для читання даних з нього}

{I+}

if (IOResult=0) then {перевірка: чи відкрито файл}

begin

{цикл читання чисел з файлу в оберненому порядку. Кількість чисел у файлі визначається

за допомогою функції FileSize }

for i:=FileSize(f)-1 downto 0 do

begin

seek(f,i); {переміщення файлового вказівника на компонент з номером i}

read(f,a); {читання числа з файлу}

write(a:8:2); {вивід числа на екран монітора}

end;

close(f); {закриття файлу}

writeln;

end;

end;

begin

clrscr;

assign(f,'numbers.dat'); {зв’язування файлової змінної з фізичним файлом}

writeln('Ввести числа та зберегти у файл');

SaveToFile; {збереження чисел у файл}

writeln('Числа з файлу');

LoadFromFile; {друк чисел з файлу у прямому порядку}

writeln('Числа з файлу в обернений послiдовностi');

LoadFromFileReverse; {друк чисел з файлу в оберненій послідовності}

readkey;

end.