Reset, Rewrite, Read, Write, Close

Для введення - висновку використовуються процедури:

Read(f,X);

Write(f,X);

де f- ім'я логічного файлу, Х - або змінна, або масив, або рядок, або безліч, або запис з таким же описом, яке має компонента файлу.

Виконання процедури Read(f,X) складається в читанні з зовнішнього пристрою одного компонента файлу і запис її в X. Повторне застосування процедури Read(f,X) забезпечить читання наступної компонента файлу і запис її в X.

Виконання процедури Write(f,X) складається в записі X на зовнішній пристрій як однієї компоненти. Повторне застосування цієї процедури забезпечить запис X як наступного компонента файлу.

Для роботи з компонентними файлами введена розширена форма операторів введення і висновку:

Read(f,X1,X2,...XK);

Write(f,X1,X2,...XK);

Тут f - компонентний файл, а змінні Х1, Х2,...ХК повинні мати той же тип, що й оголошений тип компонентів файлу f.

2.13.3 Безтипові файли

Безтипові файли дозволяють записувати на диск довільні ділянки пам'яті ЕОМ і зчитувати їх з диска в пам'ять. Операції обміну з безтиповими файлами здійснюється за допомогою процедур BlokRead і BlockWrite. Крім того, вводиться розширена форма процедур Reset і Rewrite. В іншому принципи роботи залишаються такими ж, як і з компонентними файлами.

Перед використанням логічний файл

var f: File;

повинний бути зв'язаний з фізичним за допомогою процедури Assign. Далі файл повинний бути відкритий для читання чи для запису процедурою Reset чи Rewrite, а після закінчення роботи закритий процедурою Close.

При відкритті файлу довжина буфера встановлюється за замовчуванням у 128 байт. TURBO PASCAL дозволяє змінити розмір буфера вводу - виводу, для чого варто відкривати файл розширеним записом процедур

Reset(var f: File; BufSize: Word ) чиRewrite(var f: File; BufSize: Word )

Параметр BufSize задає число байтів, що зчитуються з файлу чи записаних у нього за одне звертання. Мінімальне значення BufSize - 1 байт, максимальне - 64 К байт. Читання даних із без типового файлу здійснюється процедурою BlockRead( var f: File; var X; Count: Word; var QuantBlock: Word );

Ця процедура здійснює за одне звертання читання в змінну X кількості блоків, задана параметром Count, при цьому довжина блоку дорівнює довжині буфера. Значення Count не може бути менше 1. За одне звертання не можна прочитати більше, ніж 64 К байтів.

Необов'язковий параметр QuantBlock повертає число блоків (буферів), прочитаних поточної операцією BlockRead. У випадку успішного завершення операції читання QuantBlock = Count, у випадку аварійної ситуації параметр QuantBlock буде містити число вдале прочитаних блоків. Звідси випливає, що за допомогою параметра QuantBlock можна контролювати правильність виконання операції читання.

Запис даних у без типовий файл виконується процедурою

BlockWrite(var f: File; var X; Count: Word; var QuantBlock: Word);

який здійснює за одне звертання запис із змінної X кількості блоків, задана параметром Count, при цьому довжина блоку дорівнює довжині буфера.

Необов'язковий параметр QuantBlock повертає число блоків (буферів), записаних успішно поточною операцією BlockWrite.

2.13.4 Послідовний і прямий доступ

Зміст послідовного доступу полягає в тім, що в кожен момент часу доступний лише один компонент з усієї послідовності. Для того щоб звернутися (одержати доступ) до компонента з номером К, необхідно переглянути від початку файлу К-1 попередню компоненту. Після звертання до компоненти з номером К можна звертатися до компоненти з номером К+1. Звідси випливає, що процеси формування (запису) компонентів файлу й перегляду (читання) не можуть довільно чергуватися. Таким чином, файл спочатку будується за допомогою послідовного додавання компонент у кінець, а потім може послідовно проглядатися від початку до кінця.

Розглянуті раніше засоби роботи з файлами забезпечують послідовний доступ.

TURBO PASCAL дозволяє застосовувати до компонентного і без типового файлу, записаного на диск, спосіб прямого доступу. Прямий доступ означає можливість заздалегідь визначити у файлі блок, до якого буде застосована операція вводу - виводу. У випадку без типових файлів блок дорівнює розміру буфера, для компонентних файлів блок - це один компонент файлу.

Прямий доступ припускає, що файл являє собою лінійну послідовність блоків. Якщо файл містить n блоків, то вони нумеруються від 1 через 1 до n. Крім того, вводиться поняття умовної границі між блоками, при цьому умовна границя з номером 0 розташована перед блоком з номером 1, границя з номером 1 розташована перед блоком із номером 2 і, нарешті, умовна границя з номером n знаходиться після блоку з номером n.

Реалізація прямого доступу здійснюється за допомогою функцій і процедур FileSize, FilePos, Seek і Truncate.

Функція FileSize( var f ): Longint повертає кількість блоків у відкритому файлі f.

Функція FilePos( var f ): Longint повертає поточну позицію у файлі f. Позиція у файлі - це номер умовної границі. Для тільки що відкритого файлу поточною позицією буде границя з номером 0. Це значить, що можна записати чи прочитати блок із номером 1. Після читання чи запису першого блоку поточна позиція переміститься на границю з номером 1, і можна буде звертатися до блоку з номером 2. Після прочитання останнього запису значення FilePos дорівнює значенню FileSize.

Процедура Seek( var f; N: Longint) забезпечує призначення поточної позиції у файлі (позиціонування). У параметрі N повинний бути заданий номер умовної границі, що передує блоку, до якого буде вироблятися наступне звертання. Наприклад, щоб працювати з блоком 4, необхідно задати значення N, рівне 3. Процедура Seek працює з відкритими файлами.

Процедура Truncate( var f ) установлює в поточній позиції ознаку кінця файлу і видаляє (стирає) усі наступні блоки.

Приклад. Нехай на НМД мається текстовий файл ID.DAT, що містить числові значення дійсного типу по два числа в кожнім рядку - значення аргументу і функції відповідно. Кількість пар чисел не більш 200. Скласти програму, що читає файл, значення аргументу й функції записує в одномірні масиви, підраховує їхню кількість, виводить на дисплей і записує у файл компонентного типу RD.DAT.

Program F;

Var

rArg, rF: Array[1..200] of Real;

inf: Text;

outf: File of Real;

n, l: Integer;

Begin

Assign(inf,'ID.DAT');

Assign(outf,'RD.DAT');

Reset(inf);

Rewrite(outf);

n:=0;

While not EOF(inf) do

Begin

n:=n+1;

ReadLn(inf,rArg[n],rF[n])

End;

for l:=1 to n do

Begin

WriteLn(l:2,rArg[l]:8:2,rF[l]:8:2);

Write(outf,rArg[l], rF[l]);

End;

Close(outf)

End.

Показники

Операційна система MS - DOS весь простір, що адресується поділяє на сегменти. Сегмент - це ділянка пам'яті розміром 64 К байт. Для завдання адреси необхідно визначити адресу початку сегмента й зсув відносно початку сегмента.

У TURBO PASCAL визначений адресний тип Pointer - показник. Змінні типу Pointer

var p: Pointer;

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

Змінну типу показник можна описати іншим способом.

type NameType= ^T;

var p: NameType;

Тут p - змінна типу показник, зв'язана з типом Т за допомогою імені типу NameType. Описати змінну типу показник можна безпосередньо в розділі опису змінних:

var p: ^T;

Необхідно розрізняти змінну типу покажчик і змінну, на яку цей показник посилається. Наприклад, якщо p - посилання на змінну типу Т, то p^ - позначення тієї ж змінної.

Для змінних типу показник введено стандартне значення NIL, що означає, що покажчик не посилається ні на який об'єкт. Константа NIL використовується для будь-яких показників.

Над показниками не визначено ніяких операцій, крім перевірки на рівність і нерівність.

Змінні типу показник можуть бути записані в лівій частині оператора присвоювання, при цьому в правій частині може знаходитися або функція визначення адреси Addr(X), або виразу @X, де @ - унарна операція взяття адреси, X - ім'я змінної будь-якого типу, у тому числі процедурного.

Змінні типу показник не можуть бути елементами списку введення - виведення.


3 ВАРІАНТИ ЗАВДАНЬ НА КОНТРОЛЬНУ РОБОТУ