Последовательный доступ

При сохранении или чтении данных в Visual Basic нередко используются последовательные файлы. Последовательный файл состоит из текстовых строк ASCII-формата (рис. 8.2).

 

Рис. 8.2. Образец последовательного файла

 

Для записи данных в последовательный файл необходимо открыть его в режиме Output или Append. Если файл не существует, Visual Basic автоматически создает его. Если же файл существует, то при его открытии в режиме Output существующие данные стираются, а в режиме Append новые записи добавляются в конец файла. Обычно файлы открываются для дополнения, но иногда они используются для временного хранения данных. В таких случаях вполне допускается уничтожение содержимого файла перед каждым применением. Чтобы прочитать данные из последовательного файла, следует открыть его в режиме Input. Независимо от того, в каком режиме открывается файл — Input, Output или Append, — для операций с ним используется файловый номер (см. далее). Не забывайте закрывать ненужные файлы, вызывая оператор Close с соответствующим файловым номером. Для записи в файл можно воспользоваться оператором Print # (или Write #), а для чтения— Line Input #(a также опеpaтором lnput # или функцией Input).

Ниже приведен фрагмент программы, который создает в каталоге C:\Data файл и записывает в него две строки:

 

Dim FileNo As Integer

FileNo = FreeFile

 

Open "C:\data\test.txt" For Append As FileNo

Print #FileNo, "Джон"

Print #FileNo, "Доу"

Close FileNo

 

Функция FreeFile возвращает свободный файловый номер, который будет использоваться в операторах Open, Print # и Close. Результаты выполнения предыдущего фрагмента можно просмотреть в программах WordPad или Notepad (рис. 8.3). Чтобы файл записывался заново, а не дополнялся (другими словами, чтобы стереть содержимое файла и внести в него новые данные), следует заменить Output ключевым словом Append.

 

Рис. 8.3. Просмотр результатов

 

При загрузке сохраненных данных можно прочитать каждую строку в массив. На всякий случай напомню: массивом называется список однородных величин, на которые можно ссылаться по имени и индексу. Более подробная информация о массивах приведена в уроке 7, «Типы данных». В следующем примере в массив загружается содержимое файла C:\Data\test.txt:

 

Dim FileNo As Integer

Dim GetValues() As String

Dim Counter As Integer

 

‘Инициализировать счетчик

Counter = 0

 

‘Получить уникальный файловый номер

FileNo = FreeFile

 

' Открыть файл

Open "C:\data\test.txt" For Input As FileNo

Do Until EOF(FileNo)

Counter = Counter + 1

ReDim Preserve GetValues(Counter)

Line Input #FileNo, GetValues(Counter)

Loop

Close FileNo

 

Функция EOF проверяет, не был ли достигнут при чтении конец файла. Конец файла помечается специальным ASCII-символом, который не отображается на экране и добавляется в файл при его создании или дополнении. Когда чтение данных будет завершено, можно перебрать величины из массива GetValues и присвоить их значения элементам или вывести на форме:

 

Dim J As Integer

 

For J = 0 To UBound(GetValues)

Print GetValues(J)

Next J

 

Чтобы улучшить работу этого фрагмента, включите строку Option Base 1 в секцию (General)(Declarations) вашей формы. В результате выполнения этой команды нумерация индексов массива начинается с 1, а не с принятого по умолчанию 0. Следовательно, цикл For...Next должен начинаться со значения 1, а не 0. Функция UBound возвращает максимальный, а функция LBound — минимальный индекс массива. Совместное использование этих функций позволяет определить фактический размер массива. Следующий фрагмент перебирает все элементы одномерного массива:

 

Dim J As Integer

 

For J = LBound(arrayname) To UBound(arrayname)

' Ваша программа

Next J

 

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

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

 

Open "C:\data\test.txt" For Random As FileNo Len=10

 

Перед тем как задавать параметр Len, необходимо определить длину каждой строки данных в символах. Строка данных называется записью (по аналогии с записями баз данных). В данном разделе будет использоваться именно этот термин. Предположим, каждая запись содержит информацию о некотором человеке — фамилию, имя и краткое описание. Все эти параметры можно объединить в одну строку и записать в файл, но это затруднит дальнейшее чтение данных и их преобразование в осмысленный формат. Например, если воспользоваться следующим фрагментом:

 

Private Sub SaveFile()

Dim FileNo As Integer

Dim RecNo As Integer

Dim FName As Integer

Dim LName As Integer

Dim Lineout As Integer

 

FName = "Джейн"

LName = "Доу"

Desc = "Супруга Джона Доу"

LineOut = LName & FName & Desc

FileNo = FreeFile

RecNo = 1

 

Open "C:\test.txt" For Random As FileNo

Put #FileNo, RecNo, LineOut

Close FileNo

End Sub

 

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

 

ДоуДжейнСупруга Джона Доу

 

Некрасиво! К тому же было бы нерационально писать код для извлечения имен из этой строки, поскольку у разных людей имена имеют разную длину. Вместо этого в подобной ситуации следует объявить свой собственный тип переменной с помощью ключевых слов Type...End Type.

Оператор Type предназначен для определения нестандартных типов переменных. Он особенно полезен в ситуациях наподобие той, что описана выше. Однако перед тем, как использовать оператор Type, необходимо убедиться, что в проекте присутствует хотя бы один программный модуль. Visual Basic не позволяет объявлять типы переменных в модулях форм. Следовательно, новый тип переменных должен быть объявлен в секции (General)(Declarations) программного модуля. Добавьте следующий фрагмент:

 

Type UserInfoRecord

LName As String * 15

FName As String * 15

Desc As String * 50

End Type

 

и приведите процедуру формы к следующему виду:

 

Private Sub SaveFile()

Dim FileNo As Integer

Dim RecNo As Integer

Dim usr As UserInfoRecord

 

usr.FName = "Джейн"

usr.LName = "Доу"

usr.Desc = "Супруга Джона Доу"

 

FileNo = FreeFile

RecNo = 1

 

Open "C:\test.txt" For Random As FileNo Len = 80

Put #FileNo, RecNo, usr

Close FileNo

End Sub

 

Сейчас я кратко поясню смысл оператора Type. Чтобы создать тип переменной, следует вставить объявления нескольких переменных внутрь конструкции Type...End Type. Тип, созданный в нашем примере, делится на три самостоятельные строковые переменные — LName, FName и Desc. Обратите внимание на то, что при объявлении переменной указывается ее длина. LName и FName определяются как строковые переменные с максимальной длиной 15 символов, а длина Desc может достигать 50 символов. Если сложить вместе все длины строк-компонентов, получается 80 символов. Поскольку в файл будет записываться именно эта переменная, суммарная длина совпадает с размером записи.

Чтобы воспользоваться переменной типа User.InfoRecord, необходимо объявить ее с ключевым словом Dim, как и любую другую переменную. Тем самым вы сообщаете Visual Basic, к какому типу она относится. Затем можно обращаться к любой из внутренних переменных, указав имя составной переменной, за ним — оператор «точка» и имя внутренней переменной. Внутренней переменной можно присвоить нужное значение или же прочитать ее оператором Get#. Если запустить предыдущий фрагмент, запись сохраняется в файле. На рис. 8.4 показано, как выглядит содержимое этого файла в программе Notepad.

 

Рис. 8.4. Запись в текстовом файле

 

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

 

Двоичный доступ

Двоичный режим доступа обладает самой большой гибкостью при работе с файлами. Чтение данных в нем производится командой Get#, а запись — командой Put# (по аналогии с произвольным доступом). Двоичный доступ отличается от произвольного тем, что вы не можете случайным образом перемещаться по файлу и читать данные в любом месте. В двоичном режиме чтение данных происходит последовательно и в виде блоков. Количество байт, прочитанных из файла, равно размеру строки (в байтах), в которую должны быть занесены прочитанные данные. Например, следующий фрагмент читает из файла 10 байт:

 

Temp = String(10, " ")

Get #FileNo,, Temp

 

Обратите внимание на отсутствие параметра RecNo — причина заключается в том, что двоичные файлы читаются последовательно. Visual Basic запоминает текущую позицию файла, так что в дальнейшем вам не придется следить за ней. Давайте воспользуемся только что полученными знаниями и напишем программу для шифрования файлов. Подробности ее работы будут описаны по ходу дела.

 


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



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