Занятие 4. Использование текстовых файлов в качестве нетипизированных.
Рассмотрите пример.
Задача . Из текстового файла прочитать находящиеся там символы, заменить их на символы, отличающиеся своими кодами от исходных на определенную величину, меняющуюся от символа к символу (шифрация методом простой одноалфавитной подстановки). Поместить эти символы в новый файл, разместив в нем предварительно число перекодированных символов и таблицу смещений кодов.
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.
Дата добавления: 2015-05-16; просмотров: 751;