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;
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='' then begin 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) do begin if (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 do if inbufr^ [idx]='''' then { <= преобразуемый символ } writeln(oufile) else write(oufile,inbufr^ [idx]); end; closefile(infile); closefile(oufile); dispose(inbufr); dispose(oubufr); end. |
- Dennis Passmore [000755]