Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pesni_o_Paskale_2012-11-23.pdf
Скачиваний:
35
Добавлен:
19.03.2016
Размер:
5.16 Mб
Скачать

Глава 26 Я не читатель, — я писатель!

Наш шпионский проект по шифрованию файла подвигается к финишу. Ступим завершающий шаг: освоим запись в текстовый файл.

Запись в текстовый файл

Порядок записи в текстовый файл схож с его чтением, судите сами:

для доступа к файлу используют файловую переменную типа TEXT;

файловую переменную надо связать с файлом процедурой Assign;

по окончании записи файл закрывают процедурой Close.

Вот схема, где отражены четыре этапа записи в файл (рис. 56).

Назначить имя

 

Открыть для

 

Цикл записи в

 

 

(Assign)

 

записи

 

файл (Writeln)

 

Закрыть (Close)

 

 

(Rewrite)

 

 

 

 

 

 

 

 

 

 

 

Рис. 56 – Четыре этапа записи в файл

Как видите, запись в файл отличается от чтения вторым и третьим этапами, ими и займемся.

Итак, после привязки файла процедурой Assign, файл открывают для записи процедурой Rewrite — «перезапись».

Rewrite(F);

Тут находим первое отличие: если для чтения требуемый файл должен существовать, то для записи этого не нужно. Если файла еще нет, будет создан новый пустой файл. А при наличии файла он будет очищен, и вся информация в нем сотрется, как мел с доски. Будьте внимательны, иначе лишитесь нужной информации!

В открытый таким образом файл можно записывать нужные нам строки. Как? Вы уже знаете — процедурой Writeln. А что указать первым параметром? Правильно, — файловую переменную, вот так:

171

Глава 26 Я не читатель, — я писатель!

Writeln(F, S); { F – переменная типа TEXT, S – строковая }

Каждый вызов такой процедуры добавляет в конец файла очередную строку с разделителями. В отличие от чтения, где надо следить за достижением конца файла, при записи вы ограничены лишь объемом винчестера и здравым смыслом (в большей степени последним).

По окончании записи файл закрывают все той же процедурой Close. Как и при чтении, закрытие файла освобождает выделенную для него память и снимает блокировку, позволяя другим программам работать с ним. К тому же закрытие файла гарантирует сохранение записанных данных на диске.

Пример записи в файл

Рассмотрим небольшой пример: заполнение файла числами от 1 до 10.

{ P_26_1 }

 

 

var F: text;

{ файловая переменная }

k: integer;

 

 

begin

 

 

Assign(F, 'P_26_1.txt');

{ назначаем имя файла }

Rewrite(F);

{ открываем файл для записи }

for k:=1 to 10 do

{ записать 10 строк с числами }

Writeln(F, k);

 

Close(F);

{ закрываем файл }

end.

 

 

 

 

 

Есть вопросы? Запустите программу и проверьте, работает ли она. Запустили? Теперь отыщите в папке с программой файл «P_26_1.TXT» и откройте его любым редактором. Уверен, что вы обнаружите в нем столбик из десяти чисел.

Завершение шпионского проекта

Подойдя к финалу нашего проекта, мы научились: 1) шифровать отдельную строку, 2) читать строки из файла и 3) записывать строки в файл. Пора соединить все это: читая строки исходного файла, будем шифровать их и записывать в другой файл, — так будет работать наша программа.

Прежде всего договоримся об именах файлов. Назначив зашифрованному файлу постоянное имя, например «CRYPT.TXT», мы избавим себя от ввода его имени с клавиатуры. Вводить мы будем либо имя исходного файла — при зашифровке, либо имя конечного файла — при расшифровке. Обозначим эти неизвестные нам имена файлов как InFile и OutFile, тогда схема обработки файлов будет такой.

172

Глава 26 Я не читатель, — я писатель!

Шифрование

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

InFile Зашифрованный

файл

«CRYPT.TXT»

Расшифрованный файл OutFile

Дешифрование

Рис. 57 – Схема именования файлов при шифровании и расшифровки

С учетом этих договоренностей составим блок-схему программы (рис. 58).

Запросить операцию (зашифровать или расшифровать)

Шифровать Расшифровать

Ввести имя

 

Ввести имя

исходного файла

 

конечного файла

InFile

 

OutFile

(шифруемого)

 

(расшифрованного)

 

 

 

 

 

 

 

 

 

 

Вызвать процедуру шифрования- дешифрования

спередачей двух параметров:

имени файла и операции

Рис. 58 – Блок-схема программы шифрования/расшифровки

Основную работу поручим процедуре шифрования, блок-схема которой показана на рис. 59. В неё передаём два параметра: имя обрабатываемого файла и код операции (зашифровать или расшифровать).

173

Глава 26 Я не читатель, — я писатель!

Процедура шифрования-дешифрования

Шифровать

Дешифровать

Открыть для чтения исходный файл

Открыть для записи файл CRYPT.TXT

Открыть для чтения файл CRYPT.TXT

Открыть для записи конечный файл

Пока не конец исходного файла

Eof = TRUE

Eof = FALSE

Прочесть строку исходного файла

Шифровать Дешифровать

Шифровать строку

 

Дешифровать строку

 

 

 

 

 

 

 

 

 

 

Записать строку в файл

Закрыть оба файла

Рис. 59 – Блок-схема процедуры шифрования-расшифровки

Теперь мы готовы смастерить шпионскую программу. Может быть, сами справитесь? По крайней мере, попытайтесь. Функции и процедуры шифрования символов и строк возьмите из программы P_24_1. Написав свой вариант, сравните с представленным ниже.

174

Глава 26

Яне читатель, — я писатель!

{P_26_2 – шифрование файлов }

const CKey = 2; { Ключ Цезаря }

{ Зашифровка символа } function EnсryptChar(arg: char): char; var x: integer;

begin EnсryptChar:=arg;

if Ord(arg)>=32 then begin { управляющие символы не трогаем! } x:= Ord(arg)+ CKey;

if x>255 then x:= x-256+32; EnсryptChar:= Char(x);

end;

end;

{ Расшифровка символа } function DeсryptChar(arg: char): char; var x: integer;

begin DeсryptChar:=arg;

if Ord(arg)>=32 then begin { управляющие символы не трогаем! } x:= Ord(arg)- CKey;

if x<32 then x:= x+256-32; DeсryptChar:= Char(x);

end;

end;

{ Зашифровка строки }

procedure EnсryptString(var arg: string); var k: integer;

begin

for k:=1 to Length(arg) do arg[k]:= EnсryptChar(arg[k]);

end;

{ Расшифровка строки }

procedure DeсryptString(var arg: string); var k: integer;

begin

for k:=1 to Length(arg) do

arg[k]:= DeсryptChar(arg[k]);

end;

175

Глава 26 Я не читатель, — я писатель!

{----- Процедура шифрования файла -----}

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 EnсryptString(S)

{ зашифровать }

else DeсryptString(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.

176