| 11.4.    Стандартные процедуры и функции для файлов без типаПри работе с файлами без типа используются следующие дополнительные процедуры и функции (о переменной F см. выше). ПРОЦЕДУРЫ BlockRead (F, Buf, N [ ,Result])  - чтение из файла компонент. Из файла, с которым связана файловая переменная F, читаются N или менее (если при чтении будет достигнут конец файла) компонент и помещаются в буфер. В качестве буфера используется переменная Buf подходящего размера. Необязательный параметр Result возвращает фактическое количество прочитанных компонент. Максимальный размер переносимой информации равен N * Size (см. процедуры Reset и Rewrite) и не должен превышать 65535 байт. После выполнения процедуры указатель текущей компоненты файла перемещается на соответствующее количество прочитанных компонент. Block Write (F, Buf, N [, Result])  - запись в файл компонент. В файл, с которым связана файловая переменная F, записываются N или менее (если в процессе записи будет до конца заполнен диск) компонент из буфера Buf. Необязательный параметр Result возвращает фактическое количество записанных компонент. Максимальный размер переносимой информации равен N * Size (см. процедуры Reset и Rewrite, где описан параметр Size) и не должен превышать 65535 байт. После выполнения процедуры указатель текущей компоненты файла перемещается на соответствующее количество записанных компонент. Seek(F, Num)  - настройка на требуемую компоненту файла. Аналогична процедуре Seek для типизированных файлов. Truncate(F)  - удаление части файла, начиная с текущей позиции. Аналогична процедуре Truncate для типизированных файлов. ФУНКЦИИ FilePos (F)  - получение номера текущей компоненты файла. Аналогична функции FilePos для типизированных файлов. FileSize(F)  - получение текущего размера файла. Аналогична функции FileSize для типизированных файлов. Как указывалось выше, при работе с файлами без типа в процедурах Reset и Rewrite можно использовать дополнительный параметр, определяющий размер одной компоненты записи в байтах. Пример.  Из текстового файла Т прочитать находящиеся там символы, заменить их на символы, отличающиеся своими кодами от исходных на определенную величину, меняющуюся от символа к символу (шифрация методом простой одноалфавитной подстановки). Поместить эти символы в новый файл, разместив в нем предварительно число перекодированных символов и таблицу смещений кодов.program EXAMPLE19; Const
 NOfCod = 20	          {Размер таблицы смещений кодов}
 var FirstFile: Text;	            {Исходный файл}
 SecondFile: file;	             {Результирующий файл}
 FirstName: string;
 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('Heт места на диске');
 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) + Codesti]) 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);
 WriteLn('Конец работы программы');
 ReadLn
 end.
 В этой программе в результирующий файл окончательно будут записаны: общее число перекодированных символов, таблица смещений кодов символов и перекодированные символы. Файл используется как файл без типа с размером блока в один байт, который устанавливается процедурой Rewrite.
	
 
 |