Крім того, текстові файли відносяться до структур послідовного доступу, а бінарні - прямого. Це означає, що в будь-який момент часу можна звернутися до будь-якого, а не тільки до поточного елементу бінарного файлу.
типізовані файли
Змінні структурованих типів даних (крім строкового) неможливо вважати з текстового файлу. Наприклад, якщо потрібно ввести з текстового файлу дані для наповнення записи toy інформацією про наявні в продажу іграшках (назва товару, ціна товару і віковий діапазон, для якого іграшка призначена):
type toy = record name: string [20]; price: real;
то доведеться написати наступний код:
c: char; i, j, min, max: integer;
a: array [1..100] of toy;
begin assign (f, input); reset (f);
for i: = 1 to 100 do if not eof (f)
then with a [i] do
begin readln (f, name, price, min, max); age: = [];
for j: = min to max do age: = age + [j];
Як бачимо, таке поелементне зчитування дуже незручно і занадто багато роботи.
Вихід з цієї ситуації пропонують типізовані файли - їх елементи можуть ставитися до будь-якого базового або структурованого типу даних. Єдине обмеження: всі елементи повинні бути одного і того ж типу. Це удаване незручність є
Опис типізованих файлів
У розділі var файлові змінні, призначені для роботи з типізований файлами. описуються наступним чином:
var <файловая_перем>: File of <тип_элементов_файла>;
Ніяка файлова змінна не може бути задана константою.
Призначення типизированного файлу
З цього моменту і до кінця розділу під словом "файл" ми будемо мати на увазі "бінарний типізований файл" (зрозуміло, якщо спеціально не обумовлено інше).
Команда assign (f, '<имя_файла>'); служить для встановлення зв'язку між файлової змінної f і ім'ям того файлу, за роботу з яким ця змінна буде відповідати.
рядок ' <имя_файла> 'Може містити повний шлях до файлу. Якщо шлях не вказано, файл вважається розташованим в тій же директорії, що і виконуваний модуль програми.
Відкриття та закриття типизированного файлу
Залежно від того, які дії ваша програма збирається виробляти з відкриваються файлом, можливо двояке його відкриття:
reset (f); - відкриття файлу для зчитування з нього інформації і одночасно для запису в нього (якщо такого файлу не існує, спроба відкриття викличе помилку). Ця ж команда служить для повернення покажчика на початок файлу;
rewrite (f); - відкриття файлу для запису в нього інформації; якщо такого файлу не існує, він буде створений; якщо файл з таким ім'ям вже є, вся інформація, яка містилася в ньому раніше інформація зникне.
Закриваються типізовані файли процедурою close (f). загальної для всіх типів файлів.
Зчитування з типізований файлу
Читання з файлу, відкритого для зчитування, проводиться за допомогою команди read (). У дужках спочатку вказується ім'я файлової змінної, а потім - список введення 1):
type toy = record name: string [20]; price: real;
var f: file of toy;
a: array [1..100] of toy; begin
for i: = 1 to 100 do
if not eof (f) then read (f, a [i]); close (f);
Пошук в типизированном файлі
Уже знайома нам функція eof (f: file): boolean повідомляє про досягнутому кінці файлу. Всі інші функції "пошуку кінця" (eoln (). Seekeof () і seekeoln ()), властиві текстових файлів, не можна застосовувати до файлів типізованим.
Зате існують спеціальні підпрограми, які дозволяють працювати з типізований файлами як зі структурами прямого доступу:
1. Функція filepos (f: file): longint повідомить поточне положення вказівника у файлі f. Якщо він вказує на самий кінець файлу, що містить N елементів, то ця функція видасть результат N. Це легко пояснити: елементи файлу нумеруються починаючи з нуля, тому останній елемент має номер N-1. А номер N належить, таким чином, "неіснуючого" елементу - ознакою кінця файлу.
2. Функція filesize (f: file): longint вирахує довжину файлу f.
3. Процедура seek (f: file, n: longint) пересуне покажчик в файлі f на початок запису з номером N. Якщо виявиться, що n більше фактичної довжини файлу, то покажчик перенесуть і за реальний кінець файлу.
4. Процедура truncate (f: file) обріже "хвіст" файлу f. всі елементи починаючи з поточного та до кінця файлу будуть з нього вилучені. Насправді ж станеться лише переписування ознаки "кінець файлу" в те місце, куди вказував покажчик, а фізично "відрізані" значення залишаться на колишніх місцях - просто вони стануть "безгоспними".
Запис в типізований файл
Зберігати змінні в файл, відкритий для запису. можна за допомогою команди write (). Так само як і у випадку зчитування, першою вказується файлова змінна, а за нею - список виведення:
write (f, a, b, c); - записати в файл f (попередньо відкритий для запису командами rewrite (f) або reset (f)) змінні a. b. c.
Виводити в типізований файл можна тільки змінні відповідного опису типу даних. Неіменовані і нетипізовані константи не можна виводити в
Типізовані файли розглядаються як структури одночасно і прямого, і послідовного доступу. Це означає, що запис можлива не тільки в самий кінець файлу, але і в будь-який інший його елемент. Записується значення буде замість попереднє значення в цьому елементі (старе значення буде "затерто").
Наприклад, якщо потрібно замістити п'ятий елемент файлу значенням, що зберігається в змінної а. то слід написати наступний уривок програми: