Выбрать главу

Согласно третьему способу описание выполненное по второму способу, дополняется текстами процедур "чтения/записи" файла.

Практика показала, что использование документации файлов, составленной сторонними фирмами по второму и особенно по третьему способу не вызывало затруднений.

"Чтение/запись" файлов со сложной произвольной организацией, как правило, производится последовательными порциями. Первая порция считывается в статическую запись оперативной памяти. Эту запись называют заголовочной (header). Она содержит один или несколько байтов идентификации, которые необходимы для проверки подлинности файла (его принадлежности к конкретным программам). В заголовочной информации может быть указана версия файла. Считывание последующих порций осуществляется как в статические, так и в динамические связные переменные, причем их длина может определяться информацией, полученной как из заголовочной порции, так и из ряда предшествующих порций.

Рассмотрим пример документирования файла представленной ранее электронной таблицы при помощи таблиц структуры файла. При этом алгоритмы процедур записи информации в файл и считывания информации из файла проектировались одновременно с оперативными структурами электронной таблицы.

При разработке структуры файла были добавлены следующие глобальные описания:

Const

{Характеристики файла}

FILEIDENT = 'My Spreadsheet'; {Идентификатор}

FILESEXTENSION = 'MSS'; {Стандартный тип файла}

Var

FeleName: String; {Имя файла таблицы}

{Видимая ширина колонок таблицы}

ColWidth: array [1..MAXCOLS] of Byte;

{Информация о заполнении таблицы}

LastCol, {Последняя заполненная колонка таблицы}

LastRow: Word; {Последняя заполненная строка таблицы}

Локальные описания:

Var

EndOfFile; Char; {Признак конца текстового файла}

Col; Word; {Номер колонки клетки}

Row; Word; {Номер столбца клетки}

Count; Word; {Число заполненных клеток таблицы}

Size; Word; {Длина информации клетки}

CPtr; TCellPtr; {Указатель на клетку}

F; File; {Файловая переменная}

Blocks; Word; {Прочитано или записано байт}

Файл хранения электронной таблицы является файлом постоянного хранения, бинарным произвольной длины; имеет имя, определенное пользователем, но с расширением имени "MSS".

Организация заголовочной части файла электронной таблицы представлена в табл. 4.1.

Таблица 4.1

Заголовочная часть файла электронной таблицы

Оперативная информация Длина оперативной информации, байт Комментарий
FILEIDENT Length (FILEIDENT) Константа строки идентификации
EndofFile SizeOf (EndOfFile) Признак конца текстового файла
LastCol SizeOf (LastCol) Последняя заполненная колонка таблицы
LastRow Sizeof (LastRow) Последняя заполненная строка таблицы
Count Sizeof (Count) Число заполненных клеток таблицы на участке таблицы (1, 1, LastCol, LastRow)
ColWidth Sizeof (ColWidth[1] * MAXCOLS) Вектор ширин колонок таблицы от 1 до MAXCOLS

Запись в файл EndOfFile со значением 2610 = 1A16 (Ctrl + Z) обеспечивает вывод на экран только строки идентификации при просмотре файла с помощью большинства программ просмотра текстовых файлов.

При чтении файла электронной таблицы считанная информация первой текстовой строки файла проверяется на совпадение с FILEIDENT.

Информация о заполнении таблицы характеризует участок таблицы (1, 1, LastCol, LastRow), в пределах которого пользователь внес изменения информации таблицы.

Значение Count при записи рассчитывается с использованием двух вложенных циклов, задающих номера всех клеток на участке таблицы (1, 1, LastCol, LastRow). В циклах значение Count увеличивается на единицу, если значение указателя на информацию клетки ≠ Nil.

В таблице 4.2 приведена организация информации очередной непустой клетки файла электронной таблицы.

Таблица 4.2

Информация очередной непустой клетки файла электронной таблицы

Оперативная информация Длина оперативной информации, байт Комментарий
Col SizeOf (Col) Номер колонки клетки
Row SizeOf (Row) Номер строки клетки
Cells [Col, Row].CellFormat Sizeof (Word) Формат клетки
Size Sizeof (Size) Длина информации клетки
Фактическая информация клетки Size Информация клетки

Значение Col, Row определяют сохраняемые или сохраненные в файле координаты каждой непустой клетки. Фрагмент кода программы сохранения информации непустой клетки таблицы приведен ниже:

if Cells [Col, Row].CellPtr <> nil then

begin

CPtr:= Cells [Col, Row].CellPtr;

case CPtr^.Attrib of

TXT: Size:= Length (CPtr^.TextStr) + 3;

VALUE: Size:= Sizeof (Real) + 2;

FORMULA: Size: = Length (CPtr^.Formula) + Sizeof (Real) + 3;

end; {case}

BlockWrite (F, Col, SizeOf (Col), Blocks);

BlockWrite (F, Row, SizeOf (Row), Blocks);

BlockWrite (F, Cells [Col, Row].CellFormat, Sizeof (Word), Blocks);

BlockWrite (F, Size, SizeOf (Size), Blocks);

BlockWrite (F, CPtr^, Size, Blocks);

end;

ВЫВОДЫ

• Под структурой данных программы понимают множество элементов данных, связей между ними, а также характер их организованности. Структуры данных и алгоритмы служат основой построения программ.