Чтение онлайн

ЖАНРЫ

Шрифт:

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; { выходной файл для записи }

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, – это гарантирует сохранение данных на диске.

А слабо?

А) Программа создает файл, печатает в него несколько строк с числами, а затем выводит этот файл на экран. Воспользуйтесь одной файловой переменной.

Б) Программа для нумерации строк файла. Строки исходного файла должны копироваться в конечный файл с добавлением перед каждой строкой её номера, например:

Исходный файл:

В лесу родилась елочка,

В лесу она росла.

Зимой и летом стройная,

Зеленая была.

Конечный файл:

1

В лесу родилась елочка,

2

В лесу она росла.

3

Зимой и летом стройная,

4

Зеленая была.

В) Скопировать один файл в другой:

• с перестановкой местами четных и нечетных строк;

• с перестановкой строк в обратном порядке (см. условие задачи «Е» к 25-й главе).

Г) Для передачи по интернету секретного текстового файла разбейте его на два других: в первый запишите нечетные строки исходного файла, а во второй – четные. Напишите для этого программу, или слабо?

Д) Создайте программу для объединения двух файлов (см. условие предыдущей задачи). Из первого составьте нечетные строки конечного файла, а из второго – четные.

Глава 27

Дайте кораблю минутный отдых!

Ой, что мы с вами натворили! Могучая программа шифрования файлов дает нам право если не на медаль, то хотя бы на передышку. Пощадим наши серые клеточки и отправимся на экскурсию по своему кораблю – среде программирования Free Pascal. Ведь мы обошли ещё не все палубы этого лайнера. Сейчас рассмотрим настройку компилятора, а в следующей главе обсудим возможности текстового редактора и справочной системы.

Поделиться с друзьями: