Произвольный (random) доступ

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

1) Открыть файл оператором OPEN

Open pathName For Random [ Access — доступ ][ Lock] As #номер_файла % [ Len = длина записи ] ü pathName — имя файла, ü Access — доступ задаeт права доступа к файлу. Ниже даны типы доступа и соответствующие примеры: ü чтение — Open "file1.dat" For Random Access Read As #1, ü запись — Open "file1.dat" For Random Access Write As #1, ü чтение и запись — Open "file1.dat" For Random Access Read Write As #1, или без указания — Open "file1.dat" For Random As #1, ü Lock (блокирование) определяет права доступа к открытому файлу пользователя/процесса при коллективном использовании: ü Shared — все процессы могут писать в файл и считывать из файла, ü Lock Read Write — запрет записи в файл и считывания из файла, ü Lock Read — запрет считывания из файла, ü Lock Write — запрет записи в файл, ü As # номер_файла — номер файла, ü Len определяет длину записи

В отличие от текстових файлов, необходими указать длину записи атрибутом Len: если это значение меньше реальной длины записи, то возникает ошибка, если больше – то при записи в файл используется больше дискового пространства, чем необходимо. При этом, если длина записи неизвестна, ее можно вычислить с использованием функции Len.

2) для изменения данных в записях файла (редактирование, добавление, удаление записей) применить оператор PUT#.

PUT #номер_файла% [. номер записи][,переменная] ü #номер_файла %— номер открытого файла; ü номер записи — целочисленное выражение, которое задает номер записи в файле; ü переменная — содержит данные для записи в файл

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

Если номер записи не указан, то по умолчанию принимается текущая позиция указателя записи

Для добавления записей в файл необходимо указывать номер записи на единицу больший номера последней записи. В этом случае запись будет добавлена в файл, а не изменена.

Put #FileNum, LastRecord + 1, ForFileRecords

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

3) Для с читывания данных из файла произвольного доступа использовать оператор Get #.

GET #номер_файла% [, номер записи][,переменная] ü #номер_файла %— номер файла; ü номер записи — номер записи для чтения ü переменная — содержит данные для приема ввода из файла

Замечание. Данные из файла произвольного доступа, как правило, считываются записями. Если параметр номер записи в функции Get# не указан, считывается текущая запись, на которой позиционирован указатель.

Для позиционирования указателя можно использовать функцию Seek. Синтаксис этого оператора такой же, как для файлов последовательного доступа, но имеет другое содержание. Если для последовательных файлов позиционирование выполняется по символам, то для файлов произвольного доступа — по номеру записи:

Seek #номер_файла%, position ü #номер_файла% — номер файла; ü position — целочисленное выражение, которое задает номер записи в файле.

4) Для удаления данных из файлапроизвольного доступа существуют два способа. Можно просто очистить соответствующие поля указанных записей, то есть записать в них пустые значения. Однако в этом случае в файле остаются пустые записи. Очевидно, что при таком подходе ресурсы (дисковое пространство) используется нерационально.

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

Алгоритм этих действий такой:

ü Создайте новый файл при помощи оператора Open.

ü Перепишите все непустые записи в новый файл, используя оператор Put #.

ü Закройте исходный файл и удалите его при помощи оператора Kill.

ü Переименуйте новый файл в исходный оператором Name.

Получаем тот же самый файл, но уже без пустых записей. При этом экономится пространство диска и время поиска данных в таком файле.

5) Закрыть файл оператором CLOSE

Для вычисления номера последней записи нужно размер файла поделить на длину записи. Размер (длину) файла (в байтах) определяют с помощью функции LOF.

ЗАДАНИЕ 16.2. Постановка задачи (Доработка проекта 12.1 — Записная книжка): УСТРАНИТЕ НЕДОСТАТКИ ПРОЕКТА:

ü ПРЕДУСМОТРИТЕ СОХРАНЕНИЕ ДАННЫХ В ФАЙЛЕ ПРОИЗВОЛЬНОГО ДОСТУПА.

ü УСТРАНИТЬ ОГРАНИЧЕНИЕ НА КОЛИЧЕСТВО ЗАПИСЕЙ, ВЫВОД ИНФОРМЦИИ ОСУЩЕСТВЛЯТЬ В СПЕЦИАЛЬНЫЙ ОБЪЕКТ — ListView (Обзор списка).

ü ПРЕДУСМОТРИТЕ ВОЗМОЖНОСТЬ УДАЛЕНИЯ ЗАПИСИ ПО НОМЕРУ.

Общий вид приложения представлен на рис. 16.3. На рис.16.4 показан результат поиска по фамилии, на рис.16.5 – вид сообщения в том случае, если в записной книжке отсутствует человек с указанной фамилией, на рис.16.6 – вид сообщения при попытке удалить несуществующую запись.

Рис. 16.3 Общий вид приложения «Записная книжка»

Рис. 16.4 Результат поиска по фамилии

Рис. 16.5 Вид сообщения, если отсутствует человек с указанной фамилией

Рис. 16.6 Вид сообщения при попытке удалить несуществующую запись


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



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