Теоретический материал: файловый ввод-вывод (Паскаль)

Использование текстовых файлов в качестве нетипизированных

Рассмотрите пример.

Задача. Прочитать текстовый файл и заменить находящиеся там символы новыми, отличающимися своими кодами от исходных на определенную величину, изменяющуюся от символа к символу (шифрование методом простой одноалфавитной подстановки). Поместить зашифрованный текст в новый файл, разместив в нем предварительно число перекодированных символов и таблицу смещений кодов.

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;
  symbol : char;
{Процедура записи в файл с проверкой}
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, SecondName);
    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);
  WriteAndControl(Codes, NofCod);
{Перекодировка символов и запись содержимого полных буферов в файл}
  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;
    end;
{Запись в файл завершающей части символов}
    if i <> 0
      then
        writeAndControl(Buffer, i);
{Запись числа символов}
    NofSymb := FileSize(SecondFile)-NofCod-4;
    Seek(SecondFile, 0);
    writeAndControl(NofSymb, 4);
{Завершение программы}
    close(SecondFile);
    close(FirstFile);
    writeln('Конец работы программы ');
    readln;
End.

В этой программе в результирующий файл окончательно будут записаны: общее количество перекодированных символов, таблица смещений кодов символов и перекодированные символы. Выходной файл используется как нетиризированный с размером записи в 1 байт.