Песни о Паскале | страница 94
Подойдя к финалу нашего проекта, мы научились: 1) шифровать отдельную строку, 2) читать строки из файла и 3) записывать строки в файл. Пора соединить все это: читая строки исходного файла, будем шифровать их, и записывать в другой файл, – так будет работать наша программа.
Прежде всего договоримся об именах файлов. Назначив зашифрованному файлу постоянное имя, например «CRYPT.TXT», мы избавим себя от ввода его имени с клавиатуры. Вводить мы будем либо имя исходного файла – при шифровании, либо имя конечного файла – при расшифровке. Обозначим эти неизвестные нам имена файлов как X1 и X2, и тогда схема обработки файлов будет такой.
С учетом этих договоренностей составим блок-схему программы (рис. 58).
Основную работу поручим процедуре шифрования-расшифровки, блок-схема которой показана на рис. 59. В неё передаём два параметра: имя обрабатываемого файла и код операции (зашифровать или расшифровать).
Теперь мы готовы смастерить шпионскую программу. Может быть, сами справитесь? По крайней мере, попытайтесь. Функции и процедуры шифрования символов и строк возьмите из программы «P_24_1». Написав свой вариант, сравните с представленным ниже.
>{ P_26_2 – шифрование и расшифровка файлов }
>const CKey = 2; { Ключ Цезаря }
> { Шифрование одного символа }
>function Encrypt(arg: char): char;
>var x: integer;
>begin
>Encrypt:=arg;
>if Ord(arg)>=32 then begin { управляющие символы не трогаем! }
>x:= Ord(arg)+ CKey;
>if x>255 then x:= x-256+32;
>Encrypt:= Char(x);
>end;
>end;
> { Расшифровка одного символа }
>function Decrypt(arg: char): char;
>var x: integer;
>begin
>Decrypt:=arg;
>if Ord(arg)>=32 then begin { управляющие символы не трогаем! }
>x:= Ord(arg)- CKey;
>if x<32 then x:= x+256-32;
>Decrypt:= Char(x);
>end;
>end;
> { Шифрование строки }
>procedure EncryptStr(var arg: string);
>var k: integer;
>begin
> for k:=1 to Length(arg) do arg[k]:= Encrypt(arg[k]);
>end;
> { Расшифровка строки }
>procedure DecryptStr(var arg: string);
>var k: integer;
>begin
> for k:=1 to Length(arg) do arg[k]:= Decrypt(arg[k]);
>end;
> {----- Процедура шифрования-расшифровка файла -----}
>procedure CryptFile(const aFile: string; aOper: boolean);
>const CFixName='Crypt.txt'; { фиксированное имя файла }
>var FileIn: text; { входной файл для чтения }
> FileOut: text; { выходной файл для записи }