Файлы произвольного доступа

Файл состоит из записей одинакового размера и напоминает базу данных, что обеспечивает быстрый поиск информации. При создании файла указывается максимальная длина записи. Главным отличием от рассмотренных ранее данных является то, что такая структура данных может содержать компоненты (отдельные данные) разного типа.

Рассматриваемая структура данных часто называется записью - Record, компоненты этой структуры - полями записи - Fields. Если запись состоит из К - полей, то каждое поле записи будет иметь порядковый номер от 1 до К. Запись, как и база данных, содержит множество наборов единообразных записей, т. е. записей, состоящих из одинакового количества полей, и i-e поля всех записей имеют одинаковый тип и размер.

Набор записей можно представить в виде строк таблицы, у которой n столбцов, а i-й столбец таблицы соответствует i-y полю любой записи.

Пользовательский тип данных

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

Private / Public Type <имя типа данных>
Локальная / Глобальная
<элемент 1> As <тип элемента 1>
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
<элемент N> As <тип элемента N>
End Type

<Имя типа данных> - имя, которое присваивается определяемому типу данных, <элемент 1> ... <элемент N> - название полей записи, для которой создается пользовательский тип данных. <Тип элемента 1> . . . <тип элемента N> - стандартные типы данных, причем данные типа String должны иметь фиксированную длину. Например:

Type Mens
Name As String*15      'имя'
Famile As String*20    'фамилия'
DateR As Date             ' дата рождения'
Prim As String*30        'примечание'
End Type

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

Open <имя файла> for Random As #<Дескриптор> [Len = <длина записи>]

Если указанная длина записи меньше, чем дейтвительная, то воспроизводится ошибка. Для работы с файлом произвольного доступа следует определить тип записи, объявив пользовательский тип в программном модуле. В программном коде необходимо объявить переменную пользовательского типа, переменную для хранения длины записи, а также переменную для поиска следующей записи:

Dim <имя переменной> As <имя типа данных:>

Например,
Dim mst As Mens

В отличие от текстовых файлов при произвольном доступе к данным нет различия между файлами для записи и для чтения: и при записи и при чтении файлы открываются в режиме, определенном словом Random.

Длина записи Len - целое число, равно длине переменной пользовательского типа, которая применяется для хранения одной записи файла.

Закрытие файлов произвольного доступа выполняется аналогично последовательному доступу - Close # <Дескриптор>.

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

Put # <Дескриптор>, <номер записи>, <имя переменной>

Для чтения записей из файла - в режиме чтение - применяется оператор, который должен содержать номер записи:

Get # <Дескриптор>, <номер записи>, <имя переменной>

Пример
Dim mst As Mens
Dim Nts As Integer, Lts As Integer
Lts=Len(mst)
Open "D:\ UTF\ tt3.txt" for Random As #1 Len = Lts
Get #1, Nts, mst
Text2.Text =Trim(mst.Prim)
Put #1, Nts, mst

В данном примере величины Nts и Lts определяют соответственно номер текущей записи и длину текущей записи. Функция Len (значение) возвращает номер текущей записи, этот номер используется при открытии файла произволь¬ного доступа. Далее запись с номером Nts читается в переменную mst. Функция Trim (значение) отсекает пробелы справа при выводе данных - в данном случае в текстовое окно. И наконец, оператор добавляет новую запись или изменяет существующую (если запись с таким номером имеется). Если количество записей в файле - переменная ks, то, для того чтобы добавить запись в конец файла, необходимо

ks = ks + 1
Put #<Дескриптор>, ks> mst

Чтобы удалить запись из файла произвольного доступа, следует создать новый файл и скопировать в него все записи, за исключением той, которую необходимо удалить. Исходный файл можно удалить совсем с помощью оператора Kill, а новый переименовать с помощью оператора Name. Например:

Kill "<полное имя удаляемого файла>"
Name <старое имя> As <новое имя>