IPB

> Лекция №7.3: Записи. Бинарные файлы
Чат
Форум
Загрузка...
 

страницы: 1 2 3 4 5

Содержание

Запись с вариантной частью

Если заранее известно, что в массиве записей (таблице) некоторые поля могут оставаться пустыми (наборы пустых полей могут быть разными для разных записей), то вполне понятно желание как–то сократить неиспользуемый, но занимаемый объем памяти.

Специально для таких случаев существуют записи с вариантной частью.

Описание записи с вариантной частью

В разделе var запись с вариантной частью описывают так:

var <имя_записи>: record <поле1>: <тип1>;
                                     [<поле2>: <тип2>;]
                                     [...]
                            case <поле_переключатель>: <тип> of
                                <варианты1>: (<поле3>: <тип3>;
                                                     <поле4>: <тип4>;
                                                     ...);
                                <варианты2>: (<поле5>: <тип5>;
                                                     <поле6>: <тип6>;
                                                     ...);
                                [...]
                          end;

Невариантная часть записи (до ключевого слова case) подчиняется тем же правилам, что и обычная запись. Вообще говоря, невариантная часть может и вовсе отсутствовать.

Вариантная часть начинается зарезервированным словом case, после которого указывается то поле записи, которое в дальнейшем будет служить переключателем. Как и в случае обычного оператора case, переключатель обязан принадлежать к одному из перечислимых типов данных (см. лекцию 3). Список вариантов может быть константой, диапазоном или объединением нескольких констант или диапазонов. Набор полей, которые должны быть включены в структуру записи, если выполнился соответствующий вариант, заключается в круглые скобки.

Пример. Для того чтобы описать содержимое библиотеки, необходима следующая информация:

Для книгДля газетДля журналов

Автор

Название

Год издания

Издательство

Название

Дата выхода (день, месяц, год)

Издательство

.

Название

Год и месяц издания

Номер

Издательство

Графы «Название» и «Издательство» являются общими для всех трёх вариантов, а остальные поля зависят от типа печатного издания. Для реализации этой структуры воспользуемся записью с вариантной частью:

type biblio = record
  name, publisher : string[20];
 case item : Char of
   'b' : (author : string[20]; year: 0 .. 2004);
   'n' : (data : date);
   'm' : (year : 1700 .. 2004;
      month : 1 .. 12;
      number : Integer);
end;

В зависимости от значения поля item, в записи будет содержаться либо 4, либо 5, либо 6 полей.

Механизм использования записи с вариантной частью

Количество байтов, выделяемых компилятором под запись с вариантной частью, определяется самым «длинным» её вариантом. Более «короткие» наборы полей из других вариантов занимают лишь некоторую часть выделяемой памяти.

В приведённом выше примере самым «длинным» является вариант 'b': для него требуется 23 байта (21 байт для строки и 2 байта для целого числа). Для вариантов 'n' и 'm' требуется 4 и 5 байт соответственно (см. таблицу).

name, publisheritemВариантная часть
...'b'authoryear
...'n'data
...'m'yearmonthnumber
...'b'authoryear

Бинарные файлы

Бинарные файлы хранят информацию в том виде, в каком она представлена в памяти компьютера, и потому неудобны для человека. Заглянув в такой файл, невозможно понять, что в нём записано; его нельзя создавать или исправлять вручную — в каком–нибудь текстовом редакторе — и т. п. Однако все эти неудобства компенсируются скоростью работы с данными.

Кроме того, текстовые файлы относятся к структурам последовательного доступа, а бинарные — прямого. Это означает, что в любой момент времени можно обратиться к любому, а не только к текущему элементу бинарного файла.

Типизированные файлы

Переменные структурированных типов данных (кроме строкового) невозможно считать из текстового файла. Например, если нужно ввести из текстового файла данные для наполнения записи toy информацией об имеющихся в продаже игрушках (название товара, цена товара и возрастной диапазон, для которого игрушка предназначена):

type toy = record
    name : String[20];
    price : Real;
    age : set of 0 .. 18; {в файле задано границами}
 end;

то придётся написать следующий код:

var f : Text;
   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];
     end;
 Close(f);
 {...}
end.

Как видим, такое поэлементное считывание весьма неудобно и трудоёмко.

Выход из этой ситуации предлагают типизированные файлы — их элементы могут относиться к любому базовому или структурированному типу данных. Единственное ограничение: все элементы должны быть одного и того же типа. Это кажущееся неудобство является непременным условием для организации прямого доступа к элементам бинарного файла: как и в случае массивов, если точно известна длина каждого компонента структуры, то адрес любого компонента может быть вычислен по очень простой формуле:

<начало_структуры> + <номер_компонента>*<длина_компонента>

страницы: 1 2 3 4 5

Примечания

 
 К началу страницы 
 

Код для вставки: :: :: :: ГОСТ ::
Поделиться: //
 



-
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"