3. Анализ текстовых файлов.
Одной из типичных задач анализа файла является вычисление объёма текстового файла. При этом, в понятие объёма может вкладываться различный смысл: от общего числа символов в файле, до более утонченных оценок, например учитывающих только информационные символы (без управляющих символов), специальным образом учитывающим пробелы, отдельно учитывающим русские и латинские символы, текст и формулы и др. Ниже приведён пример одной из программ вычисления объема текстового файла в авторских листах:
program volume;
{ Расчет объема файла, где цепочки пробелов учитываются как один символ}
uses CRT, DOS;
const pg=#12;
var total:pathstr;str:dirstr;fn:namestr;fr:extstr;
ft:text;alfa,beta:Boolean;
j,page:byte;a,symb:longint;author:real;
procedure setdisc;
var c:string;
begin writeln(' Установите дискету с файлом ', fn,' и нажмите enter');
readln(c);{$I-}reset(ft);{$I+}
if IOResult<>0 then begin writeln(' Файл ',fn,' не найден!');readln;halt end;
end{setdisc};
procedure checknm;
var i:byte;digit:set of '0'..'9';
begin if str <>'' then
begin for i:=1 to length(str) do if not (str[i] <>' ') then
if (str[i]='-') and (str[i+1] in digit) then str:='';
alfa:=false;
end;
end{checknm};
BEGIN page:=1;symb:=0;a:=0;alfa:=false;beta:=false;
writeln(' Введите полное имя анализируемого файла:');
readln(total);assign(ft,total);fsplit(total,str,fn,fr);
{$I-}reset(ft);{$I+} if IOResult<>0 then
begin for j:=(length(total)-length(fn)-length(fr)) downto 1 do
if total[j] in ['A'..'Z','a'..'z'] then
if not (total[j] in ['a','A','b','B']) then
begin writeln(' Файл ',fn,' не найден');readln;halt end
else
begin setdisc;break end;
end;
repeat readln(ft,str);if str<>'' then
begin symb:=symb+length(str);for j:=1 to length(str) do
begin if alfa then checknm;
if str[j]=pg then begin page:=page+1;alfa:=true end;
if not (str[j] in [pg,' ']) and (not alfa) then inc(a);
if str[j]=' ' then beta:=true;
if beta and not (str[j] in [pg,' ']) then
begin inc(a);beta:=false end;
end;
end;
until eof(ft);
author:=a/40000; clrscr;gotoXY(10,10);
write(' ОБЪЕМ ТЕКСТА ',fn);gotoXY(10,11);
write(' Страниц: ',page);gotoXY(10,12);
write(' Всего символов в тексте: ',symb);gotoXY(10,13);
write(' Объем в авторских листах: ',author:2:3);
gotoXY(10,14);for j:=20 to 80 do write('_');writeln; readln;
END {volume}.