Содержание:
I. Чтение и запись текстовых файлов
OpenMode — указывает, как открыть файл при вызове функций для работы с файлами. Следующие режимы:
- OpenMode.Append — Файл открыт для добавления данных в его конец. Значение по умолчанию.
- OpenMode.Binary — Файл открыт для двоичного доступа.
- OpenMode.Input — Файл открыт для чтения.
- OpenMode.Output — Файл открыт для записи.
- OpenMode.Random — Файл открыт для произвольного доступа.
Выполнение:
- Поместите на форму элементы список ListBox (lst), текстовое поле TextBox (txt), кнопки: btnAdd («Добавить элемент в список»), btnSave («Сохранить в файле»), btnOpen («Загрузить из файла»). Расположите правильно элементы (рисунок).
- При нажатии на 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 |
- По щелчку на кнопке 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 |
- Событие 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 |
- Запустите приложение, внесите в список lst несколько строк и попытайтесь сохранить их в виде файла (желательно с расширением .txt: например, proba.txt). Если не написан путь к файлу, то файл сохранится в папке /bin/Debug Вашего проекта.
II. Работа с типизированными файлами
В типизированных файлах можно прочитать любую по очереди запись. Добавить новую запись в конец файла.
Задание: Хранение картотеки одинаковых по структуре карточек. Необходимо создать возможность добавления карточки и просмотра карточки по ее номеру.
Выполнение:
Разделим форму условно на две части: в первой части создадим возможность добавления карточки в картотеку, а во второй – просмотр карточки по номеру (см. рисунок):
- Разместите на форме два элемента управления GroupBox . Установите свойство Text первой группы равным Добавление в картотеку, а второй – Просмотр картотеки.
- В группу GroupBox1 добавьте 4 элемента Label и задайте их свойствам Text значения: Имя, Фамилия, Пол, Возраст.
GroupBox — контейнерный элемент, который может служить контейнером для помещенных внутрь него элементов.
- В ту же группу поместите 3 элемента TextBox. Их свойствам Text задайте пустые строки. А для свойств Name укажите: для первого элемента – FirstName, второго – LastName, третьего –Age.
- Добавьте в первую группу два объекта RadioButton. Для их свойств Name укажите: для первого элемента Male, для второго –Female. Свойство Text для первого укажите – мужской, для второго – женский.
- Расположите в группе одну кнопку (button) со свойством Name равным AddButton и свойством Text равным Добавить.
- Во второй группе разместите 7 элементов типа Label и пять текстовых полей, задайте значения их свойств в соответствии с Таблицей 12:
Таблица 12
name | text |
Label5 | Текущая карточка |
Label6 | Имя |
Label7 | Фамилия |
Label8 | Пол |
Label9 | Возраст |
txtCardNumber | |
txtfirstName | |
txtlastName | |
txtGender | |
txtAge |
- Поместите кнопку и задайте ее свойству Name значение ShowButton, а Text — Показать.
- Посчитаем необходимое количество символов для всей записи: для имени и фамилии выделим по 15 символов, для пола 1 символ, для возраста 3 символа, т.е. всего 34 символа.
- Запрограммируйте событие 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 байт), получаем количество записей; новая запись будет иметь номер, на единицу больший.
- Теперь осталось запрограммировать кнопку 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 |
- Запустите и откомпилируйте приложение. Файл cardfile.dat сохраняется в папке …/Bin/Debug.
III. Работа с нетипизированными файлами
Нетипизированные файлы – файлы, не имеющие четкую структуру.
Задание: Перепишите программу для работы с картотекой с использованием нетипизированных файлов.
Выполнение:
- Нужно всего лишь переписать процедуру-обработчик события Click для кнопки AddButton и ShowButton.
- 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 |
- 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 |
- Запустите и отладьте приложение.
- Объясните особенности работы с типизированными файлами.
- Объясните особенности работы с нетипизированными файлами.
- Для чего используется функция LOF?