Следующий код демонстрирует использование нетипизированного входного файла
для блочного чтения (blockread) текстового файла, сканирование входного буфера в
поисках любого символа и их замены на символы перевода строки и возврата
каретки. Поскольку код использует входные и выходные буфера размером 16к, то
получаемая скорость весьма приемлема.
Примечание: В процессе обработки, если длина строки выходного файла превышает
255 символов и вы хотите прочесть ее с помощью ReadLn, то просто используйте в
запросе ReadLn несколько строк, например так:
ReadLn(infile,string1,string2);
Так можно прочесть вплоть до 510 символьных строк с 1-й по 255 символ в
string1 и остальное в string2;
program fixfile; { Компилируем из DOS-приглашения: DCC FIXFILE.PAS }uses{ запускаем из File Manager }
sysutils, dialogs, forms;
type
bufptr = obufr;
iobufr = array[0..16384] of char;
var
infile: file;
oufile: textfile;
inbufr,
oubufr: bufptr;
idx: integer;
bytesread: integer;
bytes2read: integer;
totalbytesread: longint;
actualfilesize: longint;
OpenDialog1: TOpenDialog;
infilename,
oufilename: string;
begin
infilename := '';
OpenDialog1 := TOpenDialog.Create(Application);
OpenDialog1.Options := [];
OpenDialog1.Filter := 'Все файлы|*.*';
OpenDialog1.FilterIndex := 1;
OpenDialog1.Title := 'Укажите исходный файл для преобразования';
if OpenDialog1.execute then
infilename := OpenDialog1.filename;
if infilename = '' thenbegin
OpenDialog1.free;
halt;
end;
OpenDialog1.Title := 'Укажите имя создаваемого целевого файла';
if OpenDialog1.execute then
oufilename := OpenDialog1.filename;
OpenDialog1.free;
if oufilename = '' then
halt;
if infilename = oufilename then
halt;
new(inbufr);
new(oubufr);
assignfile(infile, infilename);
reset(infile, 1);
actualfilesize := filesize(infile);
assignfile(oufile, oufilename);
system.settextbuf(oufile, oubufr^);
rewrite(oufile);
totalbytesread := 0;
bytesread := 0;
bytes2read := 0;
while (totalbytesread < actualfilesize)
and (bytes2read = bytesread) and (IOresult = 0) dobeginif (actualfilesize - totalbytesread) > sizeof(inbufr^) then
bytes2read := sizeof(inbufr^)
else
bytes2read := actualfilesize - totalbytesread;
blockread(infile, inbufr^, bytes2read, bytesread);
totalbytesread := totalbytesread + bytesread;
for idx := 0 to bytesread doif inbufr^[idx] = '''' then{ <= преобразуемый символ }
writeln(oufile)
else
write(oufile, inbufr^[idx]);
end;
closefile(infile);
closefile(oufile);
dispose(inbufr);
dispose(oubufr);
end.
Представлен программный код на языке Pascal, который демонстрирует использование блочного чтения (BlockRead) текстового файла для сканирования входного буфера в поисках любого символа и замены его на символы перевода строки и возврата каретки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.