Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 2 семестр.doc
Скачиваний:
15
Добавлен:
01.04.2025
Размер:
609 Кб
Скачать
☆

2.3. Нетипизированные файлы

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

var <ФП> : file;

При работе с нетипизированными файлами используют понятия логической и физической записей. В качестве логической записи выступает элемент файла, который может быть самостоятельной единицей обмена, например компонента типизированного файла. Физическую запись образует группа последовательно расположенных на диске логических записей – блок записей. Процедуры Reset и Rewrite, открывающие нетипизированные файлы, могут содержать второй параметр – размер логической или физической записи. По умолчанию он равен 128 байтам. Сам блочный обмен организуют с помощью следующих процедур:

BlockRead(<ФП>, <Буфер>, <Кол>, <Факт_ч>);

BlockWrite(<ФП>, <Буфер>, <Кол>, <Факт_ч>);.

Параметр <Кол> задает количество логических записей, образующих блок, а параметр <Буфер> - переменная, предназначенная для хранения физической записи, т.е. это массив логических записей. Последний параметр не является обязательным и возвращает для процедуры чтения количество фактически обработанных логических записей, что может быть использовано, если размер файла не кратен размеру физической записи.

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

program Netyp_file;

const k = 50;

var

s1, s2 : string;

procedure Kopir(in_f, out_f : string);

var

f1, f2 : file;

i : word;

buf : array[1..k] of byte; {Буфер}

begin

assign(f1, in_f);

assign(f2, out_f);

reset(f1, 1); {2-й параметр - размер логической записи}

rewrite(f2, 1);

repeat

BlockRead(f1, buf, k, i);

writeln('Скопировано ', i, ' байтов');

{Для контpоля числа копиpуемых компонент}

BlockWrite(f2, buf, i)

until eof(f1);

close(f1); close(f2)

end; {Kopir}

begin

writeln('Введите имя копиpуемого файла');

readln(s1);

writeln('Введите имя файла-пpиемника данных');

readln(s2);

Kopir(s1, s2);

end.

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

program Obrabotka_netip_file;

const

kol = 10;

type vec = array[1..kol] of byte;

var

ff : file of vec; {Типизированный файл}

f : file; {Нетипизированный файл}

buf1 : array[1..kol] of vec; {Буфер для обмена с файлом}

buf : vec;

i, j : byte;

begin

randomize;

assign(ff, 'sozdan');

rewrite(ff); {Создаем типизированный файл из 10 векторов}

for i := 1 to kol do

begin

for j := 1 to kol do

buf[j] := random(256);

Write(ff, buf); {Пишем вектор в файл }

end;

close(ff);

assign(f, 'sozdan'); {Связываем с созданным файлом переменную f и}

reset(f, kol*SizeOf(vec)); {работаем с ним как с нетипизированным}

writeln('Создан файл:');

while not EOF(f) do

begin {Выводим содержимое файла на экран}

BlockRead(f, buf1, 1); {Читаем из файла 1 физическую запись}

for i := 1 to kol do

begin

for j := 1 to kol do

write(buf1[i, j] : 4);

writeln

end; {for i}

end; {while}

end.