Нагадаємо, що типізований файл складається з порцій даних, тип яких був оголошений при описі відповідної файлової змінної. В якості такої порції можуть виступати значення скалярних змінних будь-якого типу, рядки, вміст полів записи. Це означає, що всі змінні списку введення в операторі read і всі вирази в списку оператора write повинні бути такого ж типу.
У чому принципова відмінність між обміном даними з текстовим і типи- зірованним файлом?
При записи числової інформації в текстовий файл значення даних спочатку переводяться з машинного формату в символьне уявлення, довжина якого є змінною. Як правило, розмір символьного подання числа су- нням перевищує його довжину в машинному форматі. Так, наприклад, однобайто- вая величина в символьному вигляді може "розтягнутися" на 4 байта. Строкові дан ні під час запису в текстовий файл зменшують свою довжину всього на один байт (байт довжини). Тому висновок в текстовий файл зазвичай пов'язаний з додатковими за- тратами часу на переклад числових даних і зі збільшенням обсягу займаної зовнішньої пам'яті. При читанні даних з текстового файлу знову виникає допол- ково робота по перетворенню числових значень в відповідний ма- шинний формат і по формуванню байта довжини для змінних строкового типу.
Обмін з типізований файлами позбавлений обох недоліків - дані записуються в файл у тому ж форматі, в якому вони зберігаються в оперативній пам'яті. Тому з точки зору підвищення продуктивності програми та економії місця на зовнішніх носіях вигідніше працювати з типізований файлами. Може скластися враження, що застосування текстових файлів виправдано в тих завданнях, де доводиться обробляти тільки строкові дані. Насправді це не зовсім так. Справа в тому, що вміст текстового файлу, що включає як чи- словами, так і текстову інформацію, є універсальним способом перед- уявлення даних. Їх може прочитати людина, вони можуть бути передані на інші обчислювальні системи, в яких використовуються інші внутрішні
формати зберігання числової і символьної інформації. Але якщо файл іспользует- ся тільки для тимчасового зберігання даних, які найближчим часом будуть ви- користані на тому ж комп'ютері і в рамках тієї ж системи програмування, то перевагу слід віддати типізованим файлів.
Слід звернути увагу ще на одну перевагу типізованих фай-
лов в порівнянні з текстовими файлами. Так як всі записи в типизированном файлі рівної довжини, то є можливість вести не тільки послідовний обмін, але і вибирати потрібну запис. Записи в такому файлі нумеруються з 0. Після відкриття файлу стає доступною початкова запис. Для переміщення в нача ло записи з номером n_REC використовується процедура seek:
Функція FilePos дозволяє визначити номер поточної доступною записи:
За допомогою функції FileSize можна дізнатися кількість записів у файлі:
Програма rec_file спочатку демонструє можливість послідовного виведення в типізований файл, а потім зчитує записи в зворотному порядку (лістинг 10.4).
Лістинг 1 0 .4. програма rec_file
program rec_file; type
s: string [5]; b: byte;
Файл прямого доступу, відкритий для читання. дозволяє в процесі обробки проводити не тільки операції читання. але і записи. Наведений у лістингу 10.5 приклад цікавий ще й тим, що вміст одного і того ж файлу можна рас розглядати і як набір рядків, і як типізований файл з однобайтового запи- сямі. У програмі txt_rec спочатку формується вміст текстового файлу, що містить довільну кількість рядків (k - кількість рядків). Кожен рядок містить випадковий набір відображуваних символів з першої половини таблиці
ASCII (з кодами від 32 до 127). Число символів в рядку від 1 до 40 (j - довжина рядка). Кожен рядок, що записується в файл, дублюється на екрані. Потім тек- Стов файл закривається і відкривається повторно, але вже як файл прямого досту- па. Черговий символ, зчитування з файлу, піддається перетворенню з по- міццю функції LowerCase. При цьому всі символи, які не належать інтервалу [A..Z], в тому числі і керуючі байти, завершальні кожен рядок, сохраня- ються без зміни (для економії їх можна було б не піддавати перетворень нию). Модифікований таким чином символ записується в файл, відкритий для читання. Після завершення перекодування модифікований файл знову від- покривається як текстовий і його вміст виводиться на екран для зіставлення з вихідним набором даних.
Лістинг 1 0 .5. програма txt_rec
program txt_rec; var
fc: file of char; s: string;
ch: char; i, j, k: integer;
randomize; assign (ft, '1.txt'); rewrite (ft); k: = random (10) +1;
// Створюємо текстовий файл з випадковим набором символів for i: = 1 to k do
for j: = 1 to random (40) +1 do
s: = s + chr (random (95) +32); // формування випадкової рядки writeln (ft, s); // запис початкового рядка в файл writeln (s); // вивід вихідного рядка на екран
writeln; // пробіл між вихідним
// і модифікованим набором даних assign (fc, '1.txt');
reset (fc); // відкриваємо файл для читання як збірний while not EOF (fc) do
read (fc, ch); // читаємо з файлу черговий символ ch: = LowerCase (ch); // замінюємо більшу букву малої seek (fc, FilePos (fc) -1); // повертаємося на одну запис write (fc, ch); // записуємо її в файл
// Виводимо на екран вміст перекодувати файлу
for i: = 1 to k do begin
end; close (ft); readln;
Результат одного з тестових запусків виглядає наступним чином:
Running "c: \ fp_prog \ 10 \ 05 \ txt_rec.exe" Wq! M5> oeT
% Ry.6nlR2Mr-Z`Y # \ 7K_m \ QtqU`!> SM1: h6xm '?; ELu >> Q8 | n] U9Iq # puwj @ HBjm
zy> sc% jb / jk1: dvga_gn: m] kr (r ^] mjb% lku [3 xd6l1qa2o6l +? sh
% Ry.6nlr2mr-z`y # \ 7k_m \ qtqu`!> Sm1: h6xm '?; Elu >> q8 | n] u9iq # puwj @ hbjm