Процедура BlockWrite.
Формат обращения:
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.
Задание. Наберите программу, содержащую все рассмотренные выше задачи, усовершенствуйте решение, разбейте ее на процедуры (ввод, вывод, поиск), дополните комментариями. Проверьте правильность работы программы. Покажите учителю рабочий файл и листинг программы для оценки.
Дата добавления: 2015-05-16; просмотров: 787;