Рассмотрите пример.
Задача. Из текстового файла прочитать находящиеся там символы, заменить их на символы, отличающиеся своими кодами от исходных на определенную величину, меняющуюся от символа к символу (шифрация методом простой одноалфавитной подстановки). Поместить эти символы в новый файл, разместив в нем предварительно число перекодированных символов и таблицу смещений кодов.
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;
{Процедура записи в файл с проверкой}
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, FirstName);
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);
{Перекодировка символов и запись содержимого полных буферов в файл}
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;
{Запись в файл завершающей части символов}
if i <> 0
then
begin
writeAndControl(Buffer, i);
{Запись числа символов}
NofSymb:= FileSize(SecondFile)-NofCod-4;
Seek(SecondFile, 0);
writeAndControl(NofSymb, 4);
{Завершение программы}
close(SecondFile);
writeln('Конец работы программы ');
readln;
End.
В этой программе в результирующий файл окончательно будут записаны: общее количество перекодированных символов, таблица смещений кодов символов и перекодированные символы. Файл используется как файл без типа с размером блока в 1 байт, который устанавливается процедурой rewrite.