Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры данных_файлы.doc
Скачиваний:
3
Добавлен:
17.04.2019
Размер:
166.91 Кб
Скачать

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

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

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

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

При работе с файлами произвольного доступа необходимо следовать правилам:

1. Открыть файл и определить длину каждой записи:

OPEN filespec AS [#] filenum LEN = record.size

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

2. Выполнить оператор FIELD для определения размеров полей записи:

FIELD filenum, width AS string-var [width AS string-var] ...

По результатам работы оператора FIELD формируется буфер обмена между диском и ОЗУ. Общая длина буферного поля не должна превышать объявленную длину записи, с которой будут работать операторы Get и Put.

Пример:

Open “Файлдан_Ran” for Random as #1 Len=80

Field #1, 30 as name$, 50 as address$

  1. Перед записью данных на диск заполните буфер обмена с помощью операторов LSET и RSET. Числа перед этой операцией должны преобразовываться в цепочки с помощью соответствующих функций (функция МК%$, кторая переводит число в строковую переменную длиной от 2 до 8 байт).

Ctime$ = MKI$(clock%), где clock% = 2767

Операторы Rset и Lset пересылают данные в буфер перед записью их на диск оператором PUT. То есть, осуществляется правое и левое позиционирование значений строковых переменных, определенных в операторе Field.

Lset a$ = строковое выражение

Rset b$ = строковое выражение

Пример.

Open “n$” For Random as #1 len=10

Field #1, 5 as Lst1$, as 5 Rsr1$

Lset Ls1$=”Lset”

Rset Rs1$=”Rset”

Put #1, 1

После заполнения полей записи используйте оператор PUT для записи данных на диск.

Оператор PUT – записывает значения переменной из буфера в файл.

PUT [#]номер_ файла% [,[номер_записи&][,переменная]

Номер_записи& для файла прямого доступа – номер записи. Целочисленное значение номера записи может находиться в диапазоне от 1 до 32767. Под этим номером запись будет помещена в файл и в дальнейшем считана. Если номер записи опущен, то записи присваивается следующий по порядку номер по отношению к последнему оператору PUT.

Переменная – переменная, содержащая вывод записи файла.

  1. Для считывания данных из файла в буфер используйте оператор GET.

Оператор GET считывает в буфер прямого доступа или в переменную

Формат записи оператора GET.

GET [#]номер файла%[, [номер записи&][, переменная] ,

где

номер_записи& для файлов прямого доступа – номер записи для чтения. Под этим номером запись была помещена в файл и в дальнейшем считана. Если номер записи опущен, то считывается запись, следующая за последней считанной по оператору GET. Если же это первый оператор считывания, то считывается первая запись.

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

5. По окончанию работы закройте файл (CLOSE).

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

OPEN "ADD.DTA" AS #1 LEN=81

FIELD #1,25 AS name$,25 AS addres$,15 AS city$,2 AS state$,_

4 AS zip$,2 AS class$,8 AS contrib$

INPUT "Which record do you want to see: ",recnumber

GET #1,recnumber

PRINT "Data for record:";recnumber

PRINT "Name: "name$

PRINT "Addres: "addres$

PRINT "City/State/Zip: "city$,state$,CVL(zip$)

PRINT "Class: "CVI(class$)

PRINT "Most recent contrib: "SVL(contrib$)