logo search
Программирование в среде Delphy / Программирование в среде Delphi

14.2. Типированные файлы

Типированный файл – это файл с прямым доступом, в котором все записи имеют одинаковую длину. Например, можно объявить типированный файл следующим образом:

Type Tz=Record

Fio:String[40];

Voz:Byte;

End;

Var f:file of Tz;

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

Рассмотрим дополнительные процедуры и функции для работы с типированными файлами:

Procedure Seek(var f; n:LongInt); – перемещает текущий указатель файла в начало n–й записи. Записи здесь нумеруются с нуля;

Function FileSize(var f):LongInt; – возвращает длину файла в записях;

Function FilePos(var f):LongInt; – возвращает номер текущей записи;

Procedure Truncate(var f); – усекает файл с текущей позиции, т.е. отсекаются все записи, начиная с текущей записи.

Рассмотрим пример замены в любом файле одного символа на другой. Будем использовать те же компоненты, что и в предыдущем примере, только результат замены будем записывать прямо в исходный файл. Заменим, например, во всем файле маленькую букву «я» на большую «Я». Обработчик нажатия кнопки «Выполнить» будет тогда иметь следующий вид:

Procedure Button1Click(Sender:Tobject);

Var f1:File of Char; // Определяем типированный файл с длиной

// одной записи в один символ

C:Char;l:longint;

Begin

s1:=Edit1.Text; // Путь к текстовому файлу

AssignFile(f1,s1); // Назначение файловых переменных

{$I-} // Отключение стандартной обработки ошибок ввода–вывода

Reset(f1); // Открываем исходный файл на чтение

Io:=IOResult; // Запоминаем ошибку открытия файла

{$I+} // Восстанавливаем стандартную обработку ошибок ввода–вывода

If io<>0 then Begin // Проверяем наличие ошибок открытия файла

// Если есть ошибки, то выводим предупреждающее сообщение

MessageDlg('Ошибка при открытии файла '+s1, mtWarning, [mbOk], 0);

Return

End;

Memo1.lines.Loadfromfile(s1); // Выводим в Memo1 начальный файл

// Открываем цикл посимвольного чтения исходного файла

For l:=0 to Pred(FileSize(f1)) Do Begin

Read(f1,c);

If c=’я’ then Begin

c:=’Я’;

seek(f1,l);

Write(f1,c);

End;

End;

CloseFile(f1);

Memo2.Lines.LoadFromFile(s1);

End;