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

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

Var f:file of <тип>; - объявление типизированного файла

Длина любого компонента типизированного файла строго постоянна, что дает возможность организовать доступ к нему по порядковому номеру.

Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компо-ненту файла. Переменные в списках ввода-вывода должны иметь тот же тип, что и компоненты файла.

Read(f,a) – чтение очередного компонента типизированного файла f в переменную a.

Write(f,a) – запись переменной a в типизированный файл f.

Seek(f,n) – переход к n-ному компоненту.

Filesize(f) – возвращает количество компонентов файла.

Filepos(f) – выдает номер компонента, который будет обрабатываться следующей операцией ввода-вывода.

Теперь все это в примерах:

Объявляем файл байтов:

Код

var f:file of byte;

b:Byte;

Ассоциируем файловую переменную с физическим файлом:

код Pascal

AssignFile(f,'c:\myfile.bin');

Теперь мы можем либо перезаписать/создать файл:

код Pascal

Rewrite(f);

Либо открыть существующий для чтения и записи:

код Pascal

Reset(f);

Обратите внимание, что функция Reset хотя и имеет такой же формат как и для текстовых файлов, но открытый ей файл можно и читать и писать, в отличие от текстовых.

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

read(f,b); - прочитать 1 байт

write(f,b); - записать 1 байт

seek(f,100); - поставить текущее положение считывания/записи на сотый байт

Size(f); - прочитать количество байт в файле.

Eof(f); - узнать не являетсмя ли байт последним

Все эти функции не работают с файлами большими 2 Gb.

После работы файл надо закрыть:

код Pascal

CloseFile(f);

Приведенные выше механизмы будут работать с любым файлом, так как любой файл можно считать файлом байтов. Теперь где это можно использовать? В принципе везде, но в подавляющем большинстве случаев это будет очень неудобно, ведь скорость считывания при чтении по байтам будет на порядки более низкой чем другими способами. Однако в некоторых случаях этот способ может быть очень полезен. Например в программе вам надо заменить 100й байт файла на другой, или прочитать 100й байт файла, например во всяких читерских программах, при взломе и т.п. Здесь такой доступ будет весьма удобен. Гораздо более интересным представляется дальнейшее развитие технологии типизированных файлов (их еще лет 15 назад называли "Файлы прямого доступа"). Представим себе, что файл состоит не из байт а из более сложных структур. Например мы имеем некоторую информацию в виде:

Код

Type MyRec=Record

Name:string[100];

Age:byte;

Membership:Boolean;

Accounts:array[1..10] of integer;

End;

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

код Pascal

Var MyVar:MyRec;

и файл этого типа:

код Pascal

Var f:File of MyRec;

Теперь мы можем читать и писать сразу целую структуру, абсолютно так же как и если бы это был один байт:

Код

AssignFile(f,'c:\MyFile.rec');

Rewrite(f);

MyVar.Name:='Vitaly';

MyVar.Age:=33;

MyVar.Membership:=True;

MyVar.Accounts[1]:=12345;

MyVar.Accounts[2]:=34985;

Write(f,MyVar);

Closefile(f);

Все остальные функции приведенные в предыдущей статье будут работать так же, только одно отличие - Seek и Size оперируют не с количеством байт, а с количеством записей.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: