Эти файлы состоят из машинных представлений данных, причем в отличие от типизированных файлов, данные могут быть произвольных типов. с помощью этих файлов можно записывать на внешний носитель произвольные участки памяти и считывать их обратно.
Определение
f: file; - объявление ф.п.
Reset(<ф.п.>, <размер буфера>);
Rewrite(<ф.п.>, <размер буфера>); - используя эти процедуры, можно явно указать размер буфера ввода/вывода, который указывается вторым параметром.
Если 2 параметр не указан, то по умолчанию размер буфера 128 байт. Размер буфера показывает какое количество байт будет считываться из файла или записываться в файл за одно обращение. Минимальный размер буфера 1 байт, а максимальный 64 кб. Т.к. чтение и запись в не типизированные файлы производится блоками, то вместо процедур write и read используются процедуры
Для чтения BlockRead(<>, <>, <N>, [,<NN>]);
Для записи BlockWrite (<>, <>, <N>, [,<NN>]);
Первой процедурой информация из файла записывается в буферную переменную. Второй процедурой осуществляется запись данной буферной переменной в файл.
|
|
Параметр <N> определяет количество записей, которое должно быть прочитано или записано за 1 обращение к диску. Если N=1 то за 1 обращение будет считана и записана 1 ёмкость буфера. Если N>1, то запишется N ёмкостей буфера.
N<1 – не имеет смысла!
При установке значения N необходимо учитывать, чтобы выполнялось условие N* размер буфера было меньше 64 кб.
параметр NN возвращает количество фактически обработанных(записанных или считанных с записи) ёмкостей буфера. Если после завершения работы с файлом NN =N, то можно считать, что работа прошла успешно. В противном случае будет содержать количество успешно записанных емкостей буфера. Неудача посередине блока равносильна отмене его чтения или записи. При использование процедур blockread и blockwrite буферная переменная (без типовая) определяет адрес памяти начиная с которого заданная параметром N и буфером количество байт будет писаться в файл или читаться из него.
Пример записи и чтения в файла.
***
const
a:array[1..5] of byte=(1,2,3,4,5);
var
b:array[1..5] of byte;
f:file;
NN:word;
begin
Assign(f, ‘a.dat’);
rewrite(f,5);
Blockwrite(f, <>, 1, NN);
close(f);
reset (f,5);
Blockread(f, <>, 1,NN);
close(f);
***
Поскольку под статические переменные память отводится в порядке их следования в описание, то возможно записать или считать блоком сразу несколько структур данных.
Пример считывания статических данных.
Var
A,b,c:array[1..10] of byte;
.
.
Begin
.
.
Rewrite(f,sizeof(a));
Blockwrite(f,a,3);
Close(F);
.
.
RESET(f,sizeof(a));
Blockread(f,a,3);
Close(f);
Запись и чтение динамического массива.
Type
Mas=array[1..10] of byte;
Var
P:^mas;
F:file;
I:byte;
Begin
New(p);
For i:=1 to 10 do
P^[i]:=I;
|
|
Assign(f,’a’);
Rewrite(f,sizeof(mas));
Blockwrite(f,p^,1);
Close(f);
Использование не типизированного файла для хранения образа текстового экрана.
Type
V=record;
Inf:char;
Attr:byte;
End;
Mas_v=array[1..200] of v;
Var
F:file;
Ptr_V:^MAS_v;
.
.
Ptr_v:=ptr($b800,$0);
Assign(f,’a’);
Rewrite(f,sizeof(mas_v));
Blockwrite(f,ptr_v^,1);
Close(f);
Модульность программ
ЛЕКЦИЯ №16
Модульность программ. Структура модуля. Библиотечные и программные данные. Компиляция модулей. Правила подключения модулей, загрузка в память, перекрытие библиотечных данных. Закольцованность модулей.
Под модульностью понимают принцип построение программ из отдельных программных единиц - модулей.
В паскале модуль представляет собой автономно компенсируемую программную единицу, включающую в себя различные компоненты раздела описаний такие как типы: константы, константы, процедуры и функции, а так же может включать исполнимые операторы инициирующей части.
Модули используют в следующих случаях:
1. Для создание (построение) программ код, которых превышает 64 кб., таким образом модульность позволяет создавать программы практически любого размера. Сам код модуля не может превышать 64 кб. Поскольку модули при подключении к программе загружаются в ОЗУ, то количество подгружаемых модулей ограничивается объемом ОЗУ. (при условии если не используется оверлейная структура организации модулей)
2. Для построения собственных библиотек процедур и функций, которые можно подключать к различным программам. Это использование модулей аналогично использованию стандартных библиотек Паскаля таких как Crt, Graph, Dos, overlay.(они организованны как модули)
Структура модуля.
Структура модуля отображает правило построения модуля ю
Модуль разделен на 4 части:
1. Unit
«имя модуля» - заголовок модуля
2. Interface
«Интерфейсная часть» - раздел объявлений
3. Implementation
«исполняемая часть» - раздел реализации
4. [Begin
«инициирующая часть»]
End; Раздел инициализации
1. Заголовок модуля. Заголовок определяет имя модуля, по которому модуль будет подключаться к программе. Имя модуля, стоящее после ключевого слова Unit должно совпадать с именем файла, в который помещается исходный текст модуля (совпадать может только 8 символов имении, так как файл определяется 8-ю символами).Если текст модуля находится в файле Modul_1.Pas, то заголовок будет unit modul_1;
2. Раздел объявлений. Этот раздел модуля начинается с ключевого слова Interface. в этом разделе описываются типы, константы, переменные, которые будут доступны основной программе, в которой этот модуль будет подключаться и другим модулям, которые подключают исходный.
В той же части описываются заголовки процедур и функций, составляющие библиотеку подпрограмм. (Не допустимыми заголовки с директивами Interrupt и forward). Перечисленные процедуры и функции могут использовать в тех программах где подключается модуль.
Если в модуле необходимо использовать константы, типы, объявленные в других модулях, то перечислением имен других модулей.
Unit Modul_1;
Interface
Uses modul_2;
Type
«библиотечные типы»
Const
«библиотечные константы»