Program Kodirovka; Const NofCod = 20; {Размер таблицы смещений кодов} Var FirstFile : text; {Исходный файл} SecondFile : file; {Результирующий файл} FirstName, SecondName : string; IOres : byte; {Код результата работы с файлом} NofSymb : LongInt; {Число символов в файле} Codes : Array[1..NofCod] of byte; {Таблица смещений кодов символов} Buffer : Array [1..NofCod] of char; {Буфер для символов} i : word; symbol : char; {Процедура записи в файл с проверкой} Procedure WriteAndControl (Var Buf; Amount : word); Var result : word; {Число переданных символов} Begin blockwrite (SecondFile, Buf, Amount, result); if result <> Amount then begin writeln('Нет места на диске '); Halt; end; End; Begin {Связь с исходным текстовым файлом для чтения} repeat {$I-} write('Имя исходного файла: '); readln(FirstName); assign(FirstFile, FirstName); reset(FirstFile); {$I+} IOres := IOresult; if IOres <> 0 then writeln('Такого файла нет '); until IOres =0; {Связь с результирующим файлом без типа для записи} repeat {$I-} write('Имя результирующего файла: '); readln(SecondName); assign(SecondFile, SecondName); rewrite(SecondFile, 1); {Размер блока в один байт} {$I+} IOres := IOresult; if IOres <> 0 then writeln('Неправильное имя файла '); until IOres =0; {Установка счетчика символов и запись его в файл} NofSymb := 0; WriteAndControl(NofSymb, 4); {Задание таблицы смещений кодов символов, запись ее в файл} Randomize; for i := 1 to NofCod do Codes[i] := Random(256); WriteAndControl(Codes, NofCod); {Перекодировка символов и запись содержимого полных буферов в файл} i := 0; while not Eof(FirstFile) do begin Inc(NofSymb); Inc(i); if Eoln(FirstFile) then begin Buffer[i] := Chr((13+Codes[i]) mod 256); if i=NofCod then begin writeAndControl(Buffer, NofCod); i := 0; end; Inc(i); Buffer[i] := Chr((10+Codes[i]) mod 256); readln(FirstFile); end else begin read(FirstFile, Symbol); Buffer[i] := Chr((Ord(Symbol)+Codes[i]) mod 256); end; if i = NofCod then begin writeAndControl(Buffer, NofCod); i := 0; end; end; {Запись в файл завершающей части символов} if i <> 0 then writeAndControl(Buffer, i); {Запись числа символов} NofSymb := FileSize(SecondFile)-NofCod-4; Seek(SecondFile, 0); writeAndControl(NofSymb, 4); {Завершение программы} close(SecondFile); close(FirstFile); writeln('Конец работы программы '); readln; End.
|