VB 23. Работа с файлами

I. Чтение и запись текстовых файлов

* Задание: Разработайте приложение, которое сохраняет в файл информацию из списка (ListBox) и загружает из файла информацию обратно в список.
Работа с текстовыми файлами в VB
Форма «Работа с файлами»

OpenMode — указывает, как открыть файл при вызове функций для работы с файлами. Следующие режимы:

  • OpenMode.Append — Файл открыт для добавления данных в его конец. Значение по умолчанию.
  • OpenMode.Binary — Файл открыт для двоичного доступа.
  • OpenMode.Input — Файл открыт для чтения.
  • OpenMode.Output — Файл открыт для записи.
  • OpenMode.Random — Файл открыт для произвольного доступа.

Выполнение:

  1. Поместите на форму элементы список ListBox (lst), текстовое поле TextBox (txt), кнопки: btnAdd («Добавить элемент в список»), btnSave («Сохранить в файле»), btnOpen («Загрузить из файла»). Расположите правильно элементы (рисунок).
  2. При нажатии на btnAdd («Добавить элемент в список») в список lst должна добавиться строка, записанная в текстовое окно txt, а само окно при этом должно очиститься. Добавьте код для события click кнопки btnAdd:
1
2
3
4
Private Sub btnAdd_Click(…) Handles btnAdd.Click
lst.Items.Add(txt.Text) ' добавляем текст
txt.Clear() 'чистим текстовое поле
End Sub
  1. По щелчку на кнопке btnSave вся информация со списка должна добавляться во введенный пользователем текстовый файл. Для этого добавьте процедуру для события Click кнопки:
1
2
3
4
5
6
7
8
9
10
11
Private Sub btnSave_Click(…) Handles btnSave.Click
Dim filename As String
Dim i As Integer
 
filename = InputBox("Введите имя файла", "Сохранить файл") 'окно для ввода
FileOpen(1, filename, OpenMode.Output) ' открываем файл для записи
For i = 0 To lst.Items.Count - 1
  PrintLine(1, lst.Items(i)) 'записываем в файл i-ю строку списка
Next
FileClose(1)
End Sub
  1. Событие Click кнопки btnOpen («Загрузить из файла») запрограммируйте таким образом, чтобы в список помещались все строки из файла:
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub btnOpen_Click(…) Handles btnOpen.Click
Dim filename, CurStr As String
 
filename = InputBox("Введите имя файла", "Загрузить файл") 'окно для ввода
FileOpen(1, filename, OpenMode.Input) 'открываем файл для чтения
lst.Items.Clear()
While Not EOF(1)
  CurStr = LineInput(1) 'считываем очередную строку
  If CurStr <> "" Then lst.Items.Add(CurStr) 'вносим строку в список
End While
FileClose(1)
End Sub
  1. Запустите приложение, внесите в список lst несколько строк и попытайтесь сохранить их в виде файла (желательно с расширением .txt: например, proba.txt). Если не написан путь к файлу, то файл сохранится в папке /bin/Debug Вашего проекта.

II. Работа с типизированными файлами

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

Задание: Хранение картотеки одинаковых по структуре карточек. Необходимо создать возможность добавления карточки и просмотра карточки по ее номеру.

Выполнение:

Разделим форму условно на две части: в первой части создадим возможность добавления карточки в картотеку, а во второй – просмотр карточки по номеру (см. рисунок):

Работа с типизированными файлами в VB
Форма «Работа с типизированными файлами»
  1. Разместите на форме два элемента управления GroupBox . Установите свойство Text первой группы равным Добавление в картотеку, а второй – Просмотр картотеки.
  2. В группу GroupBox1 добавьте 4 элемента Label и задайте их свойствам Text значения: Имя, Фамилия, Пол, Возраст.

GroupBox — контейнерный элемент, который может служить контейнером для помещенных внутрь него элементов.

  1. В ту же группу поместите 3 элемента TextBox. Их свойствам Text задайте пустые строки. А для свойств Name укажите: для первого элемента – FirstName, второго – LastName, третьего –Age.
  2. Добавьте в первую группу два объекта RadioButton. Для их свойств Name укажите: для первого элемента Male, для второго –Female. Свойство Text для первого укажите – мужской, для второго – женский.
  3. Расположите в группе одну кнопку (button) со свойством Name равным AddButton и свойством Text равным Добавить.
  4. Во второй группе разместите 7 элементов типа Label и пять текстовых полей, задайте значения их свойств в соответствии с Таблицей 12:

Таблица 12

name text
Label5 Текущая карточка
Label6 Имя
Label7 Фамилия
Label8 Пол
Label9 Возраст
txtCardNumber  
txtfirstName  
txtlastName  
txtGender  
txtAge  
  1. Поместите кнопку и задайте ее свойству Name значение ShowButton, а Text Показать.
  2. Посчитаем необходимое количество символов для всей записи: для имени и фамилии выделим по 15 символов, для пола 1 символ, для возраста 3 символа, т.е. всего 34 символа.
  3. Запрограммируйте событие click для кнопки AddButton («Добавить»):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub AddButton_Click(…) Handles AddButton.Click
Dim card As String = ""
 
card += FirstName.Text + Space(15 - Len(FirstName.Text))
card += LastName.Text + Space(15 - Len(LastName.Text))
If Male.Checked = True Then card += "м" Else card += "ж"
card += Age.Text + Space(3 - Len(Age.Text))
FileOpen(1, "cardfile.dat", OpenMode.Random, , , 38) ' одна запись равна 38
FilePutObject(1, card, 1 + LOF(1) / 38) ' указываем позицию для очередной записи
FileClose(1)
 
FirstName.Clear()
LastName.Clear()
Age.Clear()
Male.Checked = True
End Sub

Пояснение: чтобы дополнить некоторую строку S до длины N используется выражение: S+Space(N-Len(S)). Функция Space(K) возвращает строку, состоящую из К пробелов.

Суммарная длина записи равна 38 (15 на имя + 15 на фамилию + 1 на пол +3 на возраст)

FilePutObject(1, card, 1 + LOF(1) / 38): LOF возвращает длину файла; разделив полученное значение на размер записи (38 байт), получаем количество записей; новая запись будет иметь номер, на единицу больший.

  1. Теперь осталось запрограммировать кнопку Showbutton («Показать»):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub showButton_Click(…) Handles showButton.Click
Dim card As String = ""
 
FileOpen(1, "cardfile.dat", OpenMode.Random, , , 38)
FileGetObject(1, card, Val(txtcardNumber.Text))
FileClose(1)
 
txtFirstNAme.Text = Mid(card, 1, 15)
txtLastName.Text = Mid(card, 16, 15)
If Mid(card, 31, 1) = "м" Then
  txtGender.Text = "мужской"
  Else : txtGender.Text = "женский"
End If
txtAge.Text = Mid(card, 32, 3)
End Sub
  1. Запустите и откомпилируйте приложение. Файл cardfile.dat сохраняется в папке …/Bin/Debug.

III. Работа с нетипизированными файлами

Нетипизированные файлы – файлы, не имеющие четкую структуру.

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

Выполнение:

  1. Нужно всего лишь переписать процедуру-обработчик события Click для кнопки AddButton и ShowButton.
  2. AddButton:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub AddButton_Click(…) Handles AddButton.Click
Dim gender As String
 
If Male.Checked = True Then gender = "м" Else gender = "ж"
FileOpen(1, "cardfile1.dat", OpenMode.Binary)
FilePutObject(1, FirstName.Text, 1 + LOF(1))
FilePutObject(1, LastName.Text, 1 + LOF(1))
FilePutObject(1, gender, 1 + LOF(1))
FilePutObject(1, Age.Text, 1 + LOF(1))
FileClose(1)
 
FirstName.Clear()
LastName.Clear()
Age.Clear()
Male.Checked = True
End Sub
  1. ShowButton:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub showButton_Click(…) Handles showButton.Click
Dim i As Integer
Dim fName, lName, gender, pAge As String
 
FileOpen(1, "cardfile1.dat", OpenMode.Binary)
For i = 1 To Val(txtcardNumber.Text)
  FileGetObject(1, fName)
  FileGetObject(1, lName)
  FileGetObject(1, gender)
  FileGetObject(1, pAge)
Next
FileClose(1)
 
txtFirstNAme.Text = fName
txtLastName.Text = lName
If gender = "м" Then
  txtGender.Text = "мужской"
  Else : txtGender.Text = "женский"
End If
txtAge.Text = pAge
End Sub
  1. Запустите и отладьте приложение.
Вопросы для самоконтроля:

  1. Объясните особенности работы с типизированными файлами.
  2. Объясните особенности работы с нетипизированными файлами.
  3. Для чего используется функция LOF?

* При использовании материалов обязательна ссылка на источник: Майер С.Ф., «MS Visual Basic 2008» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2017. – 92 с.