Паскаль: буферизація введення-вивединня, Детальна інформація
Паскаль: буферизація введення-вивединня
Повернемося до задачі копіювання й напишемо програму, виконання якої в сотні (!) разів швидше від програми StupidCopy. У ролі "внутрішнього буфера" виступає масив символів Buf розміром у Bufsz=32K байтів. Спочатку за викликом FileSize визначається розмір вхідного файла в байтах, а потім файл читається в масив порціями по Bufsz байтів. Обробка цього буфера в даному разі полягає в блочному копіюванні у вихідний файл. Остання порція може містити менше, ніж Bufsz байтів – масив заповнюється та переписується в файл не до кінця.
program QuickCop;
const Bufsz=32768;
var f, g : file;
Buf : array[1..Bufsz] of char;
restfil, portion : Longint;
rdin, wrou : word; s : string;
begin
writeln( 'Задайте ім'я файла-джерела:');
readln (s); assign (f , s );
writeln( 'Задайте ім'я цільового файла:');
readln (s); assign (g , s );
reset(f, 1); rewrite(g, 1);
restfil:=filesize(f);
while restfil>0 do
begin
if restfil>Bufsz then portion:=Bufsz
else portion:=restfil;
dec(restfil, portion);
Blockread (f, Buf, portion, rdin);
if rdin<>portion then
begin
writeln('Помилка читання файла'); halt
end;
Blockwrite(g, Buf, portion, wrou);
if wrou<>portion then
begin
writeln('Помилка запису файла'); halt
end;
end;
program QuickCop;
const Bufsz=32768;
var f, g : file;
Buf : array[1..Bufsz] of char;
restfil, portion : Longint;
rdin, wrou : word; s : string;
begin
writeln( 'Задайте ім'я файла-джерела:');
readln (s); assign (f , s );
writeln( 'Задайте ім'я цільового файла:');
readln (s); assign (g , s );
reset(f, 1); rewrite(g, 1);
restfil:=filesize(f);
while restfil>0 do
begin
if restfil>Bufsz then portion:=Bufsz
else portion:=restfil;
dec(restfil, portion);
Blockread (f, Buf, portion, rdin);
if rdin<>portion then
begin
writeln('Помилка читання файла'); halt
end;
Blockwrite(g, Buf, portion, wrou);
if wrou<>portion then
begin
writeln('Помилка запису файла'); halt
end;
end;
The online video editor trusted by teams to make professional video in
minutes
© Referats, Inc · All rights reserved 2021