Советы по Delphi

         

BlockRead и текстовый файл


Следующий код демонстрирует использование нетипизированного входного файла для блочного чтения (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;
typebufptr = obufr;iobufr = array[0..16384] of char;
varinfile : 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 theninfilename := OpenDialog1.filename;
if infilename='' thenbeginOpenDialog1.free;halt;end;
OpenDialog1.Title := 'Укажите имя создаваемого целевого файла';if OpenDialog1.execute thenoufilename := OpenDialog1.filename;
OpenDialog1.free;
if oufilename='' thenhalt;
if infilename=oufilename thenhalt;
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^) thenbytes2read := sizeof(inbufr^)elsebytes2read := actualfilesize-totalbytesread;
blockread(infile,inbufr^,bytes2read,bytesread);
totalbytesread := totalbytesread + bytesread;for idx := 0 to bytesread doif inbufr^ [idx]='''' then { <= преобразуемый символ }writeln(oufile)elsewrite(oufile,inbufr^ [idx]);end;
closefile(infile);closefile(oufile);
dispose(inbufr);dispose(oubufr);
end.

- Dennis Passmore [000755]



Содержание раздела