Робота з типізований файлами free pascal

Нагадаємо, що типізований файл складається з порцій даних, тип яких був оголошений при описі відповідної файлової змінної. В якості такої порції можуть виступати значення скалярних змінних будь-якого типу, рядки, вміст полів записи. Це означає, що всі змінні списку введення в операторі 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

Схожі статті