Пользовательский тип данных
Файлы произвольного доступа хранят структурированные данные и состоят из записей.
Запись – это некоторая порция данных, которая имеет строго определенный размер и свой номер в файле.
Доступ к данным произвольного доступа осуществляется по номеру записи. Чтение данных или запись данных в файл произвольного доступа также выполняется записями. Запись файла должна иметь определенную структуру.
Для определения переменных, которые могли бы хранить структуру в VISUAL BASIC, нет встроенных типов таких как, например Integer, String и т.д. Однако VISUAL BASIC позволяет создавать на основе встроенных типов так называемые пользовательские типы. К пользовательским типам относиться тип запись. Запись позволяет хранить совокупность данных разного типа и представляет собой структуру, компоненты которой являются полями записи.
Все пользовательские типы необходимо объявлять. Это делается следующим образом:
{Private| Public} Type ИмяТипаДанных
Элемент1 As ТипЭлемента1
. . .
ЭлементN As ТипЭлементаN
End Type
где: ИмяТипаДанных - это имя, которое присваивается определяемому типу данных;
Элемент1- ЭлементN – имена полей записи;
ТипЭлемента – любой встроенный или объявленный ранее пользовательский тип.
Примечание: все данные String должны иметь фиксированную длину.
Пользовательский тип запись следует объявлять как Public в секции General стандартного модуля, если необходимо чтобы он был доступен из всех процедур всех модулей.
Например, определим следующий пользовательский тип данных:
‘(General)(Declarations)
Public Type ДанныеСтудент
Фамилия As String*15
Имя As String*10
Группа As String*4
ОцМатем As Integer
ОцИнфор As Integer
ОцФилос As Integer
End Type
После определения пользовательского типа данных необходимо объявить переменные, которые будут иметь этот тип.
Объявим переменную Студент, имеющую пользовательский тип ДанныеСтудент и найдем длину записи, которой будет являться любое значение этой переменной:
Dim Студент As ДанныеСтудент, x AsInteger
x= Len(Студент)
Переменные пользовательского типа могут быть локальными, глобальными и переменными контейнера
Файлы с произвольным доступом
Открытие файла
Open ИмяФайла For Random [Access доступ] [блокировка] _
As #ДескрипторФайла Len= ДлинаЗаписи
где: - Random – определяет режим доступа к данным - произвольный;
- Accessпозволяет задать права доступа к открываемому файлу. Параметр Доступ задается константами: Read – только для чтения, Write – только на запись, Read Write – чтение и запись (действует по умолчанию);
- Блокировка позволяет определить права доступа к данным файла при многопользовательской работе. Параметр может принимать значения:
ü Shared – файл может использоваться всеми пользователями для чтения и записи;
ü Lock Read – запрещает другим пользователям считывать данные этого файла;
ü Lock Write – запрещает другим пользователям записывать данные в этом файл;
ü Lock ReadWrite – запрещает другим пользователям считывать и записывать в файл.
- ДлинаЗаписи - целое число. Оно должно быть равно длине переменной пользовательского типа, которая применяется для хранения одной записи файла. Если это значение меньше длины записи, то возникает ошибка, если больше, то будет использоваться больше дискового пространства.
Запись в файл
Для включения в файл произвольного доступа новой записи используется оператор:
Put # ДескрипторФайла[, НомерЗаписи], ИмяПеременной
НомерЗаписи - это номер (целое положительное число), который будет иметь запись, помещаемая в файл. Если номер записи не указан, то запись данных осуществляется в текущую запись (текущая запись – это запись на которой позиционирован указатель).
ИмяПеременной - это имя переменной пользовательского типа, значением которой является запись, помещаемая в файл.
Чтение из файла
Для извлечения записи из файла произвольного доступа применяется оператор:
Get # ДескрипторФайла[, НомерЗаписи], ИмяПеременной
Где:
НомерЗаписи - это номер извлекаемой из файла записи. Если номер не указан, считывается текущая запись.
ИмяПеременной - это имя переменной пользовательского типа, значением которой является запись, извлекаемая из файла.
Вид экрана с текстами процедур создания и обработки файла прямого доступа и формой с результатом показаны на рис. 7.19.
Пример решения задачи создания и обработки файла прямого доступа:
Private Type ДанныеСтудент
Фамилия As String * 15
Имя As String * 10
Группа As String * 4
ОцМатем As Integer
ОцИнфор As Integer
ОцФилос As Integer
End Type
Private Sub Command1_Click()
Dim Студент As ДанныеСтудент, i As Integer
Open "danst" For Random As #1 Len = Len(Студент)
For i = 1 To 5
Студент.Фамилия = InputBox("Фамилия")
Студент.Имя = InputBox("Имя")
Студент.Группа = InputBox("Группа")
Студент.ОцМатем = Val(InputBox("Оценка по _ математике"))
Студент.ОцИнфор = Val(InputBox("Оценка по _ информатике"))
Студент.ОцФилос = Val(InputBox("Оценка по _ философии"))
Put #1, i, Студент
Next
Close 1
End Sub
Private Sub Command2_Click()
Dim Студент As ДанныеСтудент, i As Integer
Open "danst" For Random As #1 Len = Len(Студент)
For i = 1 To LOF(1)/Len(Студент)
Get #1, i, Студент
Print " " & Trim(Студент.Фамилия) & " " & _
Trim(Студент.Имя) & " " & Trim(Студент.Группа)
Next i
Close #1
End Sub
Рис. 7.19. Результат решения задачи создания и обработки файла прямого доступа.
Файлы двоичного доступа
Для открытия двоичного файла применяется оператор:
Open ИмяФайла For Binary As # ДескрипторФайла
Как и в файл произвольного доступа в двоичный файл можно помещать записи с полями различного типа. Однако этот файл может содержать записи различной длины. Поэтому при объявлении типа данных у строковых полей длина может быть не фиксирована.
Запись данных в файл происходит при помощи оператора:
Put # ДескрипторФайла, НомерБайта, ИмяПеременной
где:
НомерБайта - номер байта в файле, т.е. то место в файле, куда надо поместить данные.
Чтение данных из двоичного файла осуществляется оператором:
Get # ДескрипторФайла, НомерБайта, ИмяПеременной
Где:
НомерБайта - номер байта в файле, т.е. то место в файле, откуда надо прочитать данные.
Найти этот номер байта бывает очень трудно. В этом заключается недостаток двоичного доступа.
Пример:
Private Type ФамИм
Фамилия As String
Имя As String
End Type
Dim фаим As ФамИм
Dim mas() As String * 1
Private Sub Command1_Click()
Open "Faim.bin" For Binary As #1
L% = 1
For i = 1 To 2
фаим.Фамилия = InputBox("Фамилия")
Lf% = Len(фаим.Фамилия)
фаим.Имя = InputBox("Имя")
Li% = Len(фаим.Имя)
Put #1, L, фаим.Фамилия
Put #1, L + Lf, фаим.Имя
L = L + Li + Lf
Next
Close 1
End Sub
Private Sub Command2_Click()
Open " Faim.bin" For Binary As #1
k = LOF(1)
ReDim mas(k)
For i = 1 To k
Get #1, i, mas(i)
Print mas(i);
Next
Close #1
End Sub