Для введення - висновку використовуються процедури:
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 ВАРІАНТИ ЗАВДАНЬ НА КОНТРОЛЬНУ РОБОТУ