Формат обращения:
blockwrite(Var F: file; Var Buf; Kolblocks: word; result: word);
Процедура предназначена для быстрой передачи в файл F определенного числа записей из переменной Buf. Все параметры процедуры blockwrite аналогичны параметрам процедуры blockread. Разница лишь в том, что файл должне быть подготовлен для записи процедурой rewrite. Содержимое переменной Buf целиком помещается в файл, начиная с текущей записи.
Обе процедуры выполняют операции ввода-вывода блоками. Объем блока в байтах определяется по формуле:
Объем = Kolblocks * recSize,
где recSize – размер записи файла, заданный при его открытии. Суммарный объем разового обмена не должен превышать 64 Кбайт. Помимо скорости передачи данных преимущество этих процедур заключается в возможности пользователя самостоятельно определять размер буфера для файловых операций. Эта возможность играет значительную роль в тех задачах, где необходимо жесткое планирование ресурсов. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной Buf была достаточной для размещения всех байт при чтении информации с диска.
|
|
Дело в том, что чтение информации из файла в буфер, равно как и запись из буфера в файл, производится без типового контроля. Поэтому несоблюдение указанного условия может привести к порче соседних с буфером данных или к помещению на файл посторонней информации.
Если при чтении указана переменная Buf недостаточной длины или если в процессе записи на диск не окажется нужного свободного пространства, то произойдет следующее. Если последний параметр result в этих вызовах не задан, то возникает ошибка ввода-вывода; если параметр result задан, то ошибка не будет зафиксирована, а после выполнения процедуры его значение не будет совпадать с значением параметра Kolblocks. Последнее обстоятельство можно проверить, сравнив два указанных значения.
После завершения процедуры указатель смещается на result записей.
Рассмотрите примеры простых задач.
Задача № 1. Составить программу, которая создает нетипизированный файл из 100 чисел и выводит на экран k-ый элемент.
Program Netipiz1;
Uses
Crt;
Type
FileType = file;
Var
f: FileType;
P, B, k: byte;
Begin
ClrScr;
assign(F, 'MyFile');
rewrite(F,1);
Randomize;
for k:= 1 to 100 do
begin
P:= Random(100);
blockwrite(F, P, 1);
end;
close(F);
reset(F,1);
for k:= 1 to 100 do
begin
blockread(F, P, 1);
write(p,' ');
end;
write('Введите номер нужного элемента ');
readln(k);
Seek(F, k-1);
blockread(F, P, 1);
writeln(k,'-ий элемент файла равен ', P);
close(F);
End.
Задача № 2. Составить программу, которая создает копию элементов нетипизированного файла f и помещает в файл g.
Program Netipiz2;
Uses
Crt;
Var
f, g: file;
Stroka1, sб Stroka2: string;
Begin
ClrScr;
write('Введите имя исходного файла');
read(Stroka1);
assign(f, Stroka1);
rewrite(f,1);
write('Введите содержимое файла ');
|
|
repeat
readln(s);
blockwrite(f, s, 1);
until readKey = #27;
close(f);
reset(f,1);
write('Введите имя конечного файла');
read(Stroka2);
assign(g, Stroka2);
rewrite(g,1);
while not Eof(f) do
begin
blockread(f, s, 1);
blockwrite(g, s, 1);
end;
close(f);
close(g);
write('Содержимое конечного файла:');
while not Eof(g) do
begin
blockread(g, s, 1);
write(s);
end;
readln;
End.
Задача № 3. Составить программу, которая создает массив целых чисел и записывает его в нетипизированный файл, а также вычисляет среднее арифметическое элементов файла.
Program Netipiz3;
Uses
Crt;
Var
f: file;
i, k, s: integer;
Mas: Array [1..10] of byte;
Begin
ClrScr;
Randomize;
for i:= 1 to 10 do
Mas[i]:= Random(10);
assign(f, 'file.dat');
rewrite(f,1);
blockwrite(f, Mas, 10);
close(f);
reset(f,1);
while not Eof(f) do
begin
blockread(f, k, 1);
s:= s+k;
Inc(i);
end;
close(f);
write(s/i:5:2);
readln;
End.
Задание. Наберите программу, содержащую все рассмотренные выше задачи, усовершенствуйте решение, разбейте ее на процедуры (ввод, вывод, поиск), дополните комментариями. Проверьте правильность работы программы. Покажите учителю рабочий файл и листинг программы для оценки.