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.
|