При сохранении или чтении данных в 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 запоминает текущую позицию файла, так что в дальнейшем вам не придется следить за ней. Давайте воспользуемся только что полученными знаниями и напишем программу для шифрования файлов. Подробности ее работы будут описаны по ходу дела.
|
|