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; { выходной файл для записи }
S: string;
begin
if aOper then begin { если шифровать }
Assign(FileIn, aFile);
Assign(FileOut, CFixName);
end else begin { если расшифровать }
Assign(FileIn, CFixName);
Assign(FileOut, aFile);
end;
Reset(FileIn); { открыть входной файл для чтения }
Rewrite(FileOut); { открыть выходной файл для записи }
while not Eof(FileIn) do begin
{ пока не закончился входной файл }
Readln(FileIn, S); { читать очередную строку из файла }
if aOper
then EncryptStr(S) { зашифровать }
else DecryptStr(S); { расшифровать }
Writeln(FileOut, S); { записать в выходной файл }
end;
{ закрыть оба файла }
Close(FileIn); Close(FileOut);
end;
{----- Главная программа -----}
var S: string;
Oper: boolean; { TRUE – шифровать, FALSE – расшифровать}
begin
Write('Укажите операцию (1 – шифровать, иначе – расшифровать):');
Readln(S);
Oper:= S='1'; { Oper=TRUE если S='1' }
if Oper
then Write('Введите имя шифруемого файла: ')
else Write('Введите имя расшифрованного файла: ');
Readln(S);
CryptFile(S, Oper); { Вызов процедуры шифрования–расшифровки }
Write('OK, нажмите Enter'); Readln;
end.
Пространные пояснения излишни. Признак выполняемой операции формируется в булевой переменной Oper в третьей строке главной программы по цифре, введенной в переменную S. Значение Oper=TRUE влечет зашифровку файла, а FALSE — расшифровку. Затем в переменную S вводится имя обрабатываемого файла. В конце концов, вызывается процедура CryptFile с передачей в неё двух параметров: имени файла и признака выполняемой операции (aFile и aOper). Приставка «a» в начале имен этих параметров (префикс) помогает при чтении программы отличить параметр от других переменных.
Полюбуйтесь, во что превратила эта программа один из файлов на Паскале (приведен небольшой фрагмент).
}"Rtqi2420rcu"
xct"Ocp"<"uvtkpi=
}///"░гьёднзпкз"▒т░шзжхтэ"///
rtqegfwtg"Rcwug=
dgikp
"""""Ytkvgnp*)Пвиокфз"Gpvgt<)+=""Tgcfnp=
Как говорится, родная мама не узнает! Все, что попадает в «мясорубку» нашего шифровальщика, обращается в фарш. Однако последующая расшифровка «перемолотого» файла в точности восстановила его.
Примененный нами метод шифрования не так уж крут, опытный взломщик легко раскроет его. Но фундамент заложен, и когда-нибудь вы придумаете изощренные методы шифрования. Например, ключ шифра можно сделать переменным и зависящим от номера символа в строке или файле. Подумайте над этим. Если же вы намерены заняться криптографией всерьез, изучайте математику! Для программиста это наука номер один.
Итоги
• Для записи в текстовый файл, как и для чтения, требуется файловая переменная типа TEXT.
• Перед записью выполняют два действия: связывание переменной с файлом процедурой Assign и открытие файла для записи процедурой Rewrite.
• Вызов процедуры Rewrite либо создаёт новый файл, либо очищает существующий (вся бывшая в нём информация теряется!).
• Запись отдельных строк в файл выполняют процедурой Writeln, первым параметром здесь указывают файловую переменную.
• По окончании записи файл закрывают процедурой Close, – это гарантирует сохранение данных на диске.
А слабо?
А) Программа создает файл, печатает в него несколько строк с числами, а затем выводит этот файл на экран. Воспользуйтесь одной файловой переменной.
Б) Программа для нумерации строк файла. Строки исходного файла должны копироваться в конечный файл с добавлением перед каждой строкой её номера, например:
Исходный файл:
В лесу родилась елочка,
В лесу она росла.
Зимой и летом стройная,
Зеленая была.
Читать дальше