Добавление данных к файлу. Создание объекта FileSystemObject
Цель работы: Изучение и использование операторов языка VB 6 для работы с файлами различных типов: последовательными (текстовыми) файлами, файлами произвольного доступа, бинарными файлами. Исследование и использование инструмента Common Dialog для открытия и сохранения файлов, выбора шрифта и цвета, а также использование объекта Clipboard для хранения фрагментов текста, – на примере создания простого текстового редактора.
Контрольные вопросы:
1. Какими способами можно открыть текстовый файл? Как закрыть текстовый и любой другой открытый файл?
2. Как записываются данные в открытый для записи текстовый файл? В чем разница между операторами Write и Print?
3. Как читаются данные из открытого для чтения текстового файла? Чем отличаются друг от друга операторы Input и Line Input? При помощи какой функции можно прочитать из файла заданное число символов? Как прочитать все символы файла?
4. Что такое пользовательский тип данных и как используется это понятие при работе с файлами произвольного доступа (raf )?
5. С помощью каких операторов из файла raf читаются записи и в файл raf пишутся новые записи?
6. С какой целью определяется и используется индекс при работе с файлом raf ?
7. Каковы особенности использования бинарных файлов? Как они открываются? Как производится чтение из бинарного файла и запись в бинарный файл?
8. Как можно применить элемент управления Common Dialog для загрузки содержимого текстового файла в текстовое поле? Как с помощью того же элемента управления сохранить отредактированный текст в текстовом файле?
9. Как можно применить элемент управления Common Dialog для загрузки содержимого файла rtf в поле Rich Textbox ? Как с помощью того же элемента управления сохранить отредактированный текст в файле rtf ?
10. Как можно применить элемент управления Common Dialog для изменения значений параметров шрифта и для изменения цвета текста в окне Textbox (или выделенного фрагмента текста в окне Rich Textbox )?
Пример 7.1. Рассмотрим приложение, демонстрирующее запись в текстовый файл (и чтение из текстового файла) «сведений о сотрудниках» – строк, каждая из которых содержит идентификационный номер, ФИО, дату рождения и место рождения сотрудника. Строки образуют таблицу, которую на экранной форме будут имитировать 4 элемента управления Combo Box (рис. 7.1), образующие массив объектов Comb(i), у которых свойство Style имеет значение 1 – SimpleCombo.
DIV_ADBLOCK265">
Comb(j).ListIndex = i
‘ Добавление новой записи в таблицу:
Private Sub mnuAdd_Click()
XC(j) = Comb(j).Text
Comb(j).AddItem XC(j)
‘ Удаление записи из таблицы:
Private Sub mnuRemove_Click()
i% = Comb(0).ListIndex
If i < 0 Then
MsgBox "Выделите удаляемую строку", vbExclamation
Comb(j).RemoveItem i
‘ Вставка новой записи в таблицу:
Private Sub mnuInsert_Click()
i% = Comb(0).ListIndex
If i < 0 Then
MsgBox "Выделите строку для вставки перед ней", vbExclamation
Comb(0).AddItem InputBox("Введите номер"), i
Comb(1).AddItem InputBox("Введите фио"), i
Comb(2).AddItem InputBox("Введите дату рожд."), i
Comb(3).AddItem InputBox("Введите место рожд."), i
‘ Изменение записи в таблице:
Private Sub mnuUpdate_Click()
i% = Comb(0).ListIndex
If i < 0 Then
MsgBox "Выделите изменяемую строку", vbExclamation
Comb(0).List(i) = InputBox("Введите номер", Comb(0).List(i))
Comb(1).List(i) = InputBox("Введите фио", Comb(1).List(i))
Comb(2).List(i) = InputBox("Введите дату рожд.", Comb(2).List(i))
Comb(3).List(i) = InputBox("Введите место рожд.", Comb(3).List(i))
‘ Очистка всей таблицы:
Private Sub mnuClear_Click()
‘ Заполнение таблицы сведениями из текстового файла:
Private Sub mnuLoad_Click()
Open "person. txt" For Input As #1
Input #1, numb, fio, bdate, bloc
Comb(0).AddItem numb
Comb(1).AddItem fio
Comb(2).AddItem bdate
Comb(3).AddItem bloc
‘ Запись сведений таблицы в текстовый файл:
Private Sub mnuSave_Click()
N% = Comb(0).ListCount
Open "person. txt" For Output As #1
For i = 0 To N - 1
numb = Val(Comb(0).List(i))
fio = Comb(1).List(i)
bdate = CDate(Comb(2).List(i))
bloc = Comb(3).List(i)
Write #1, numb, fio, bdate, bloc
‘ Завершение работы приложения:
Private Sub mnuExit_Click()
Пример 7.2 . Рассмотрим приложение, которое демонстрирует использование элементов управления Common Dialog для открытия и сохранения файла, для выбора шрифта и цвета, а также для редактирования текста.
Файл формата TXT будет загружаться в текстовое поле (левое поле на рис. 7.2), а файл формата RTF – в поле Rich Textbox (правое поле на рис. 7.2).
DIV_ADBLOCK267">
Для реализации компьютерного интерфейса заполняется следующая таблица свойств:
объекта | Класс объекта | Свойство объекта | Значение свойства |
“Панели общего диалога” |
|||
Закладка Open / Save As |
|||
Закладка Font |
|||
Закладка Color |
В таблице не предствавлены свойства команд меню Font , Color и Edit . Ниже приводится код процедур также лишь для команд меню File (Open , Save и Save As ). Составление кода для других команд меню – тема 2-го задания данной работы.
Private Sub mnuOpen_Click()
CommonDialog1.ShowOpen
F$ = CommonDialog1.FileName
If Right(F, 3) = "rtf" Then
RichTextBox1.LoadFile F
ElseIf Right(F, 3) = "txt" Then
Open F For Input As #1
S$ = Input(N, 1)
Private Sub mnuSave_Click()
CommonDialog1.ShowSave
F$ = CommonDialog1.FileName
Private Sub mnuSaveAs_Click()
CommonDialog1.ShowSave
F$ = CommonDialog1.FileName
RichTextBox1.SaveFile F, rtfRTF
В ходе выполнения данной работы студент должен выполнить 2 задания.
Задание 1. В процессе выполнения задания студенты осваивают имеющиеся в VB 6 возможности работы с файлами произвольного доступа (RAF – random access file ).
Для заданной таблицы базы данных объявляется пользовательский тип данных, объявляется переменная этого типа (учебное пособие , стр. 108 – 112), составляются и отлаживаются процедуры, в которых используется переменная пользовательского типа.
В частности реализуются процедуры для команд меню Записать в файл RAF и Читать из файла RAF . Как и в примере 7.1, для редактирования данных используется массив объектов Combo Box и меню Edit с пятью командами подменю: Добавить запись , Удалить запись , Вставить запись , Изменить запись , Очистить таблицу .
Вариант 1 .
Объявить пользовательский тип данных для таблицы «Автомобиль» (табл. 7.1) базы данных «Автосервис».
автомобиля |
автомобиля |
неисправности |
В нижней строке таблицы 7.1 – типы полей.
Вариант 2 .
Объявить пользовательский тип данных для таблицы «Неисправности» (табл. 7.2) базы данных «Автосервис».
неисправности | Название неисправности | Стоимость |
В нижней строке таблицы 7.2 – типы полей.
Используя приложение примера 7.1 как образец, организовать ввод и редактирование данных для представленной таблицы, запись этих данных в файл произвольного доступа и чтение данных из файла произвольного доступа. Как и в примере 7.1, указанные действия реализовать как работу команд меню, показанного на рис. 7.1.
Задание 2. В ходе выполнения задания студенты дополняют приложение примера 2 новыми возможностями, которые позволяют рассматривать это приложение как простой текстовый редактор.
Вариант 1 Common Dialog реализовать команды меню Font и Color (с подменю Цвет символов и Цвет фона ). С помощью этих команд должен обеспечиваться выбор шрифта (его наименования, начертания и размера) для выделенного фрагмента текста в окне Rich Textbox , а также выбор цвета символов выделенного фрагмента и выбор цвета фона всего этого окна.
Указание: При настройке объекта Common Dialog для выбора шрифта с помощью свойства (Custom) обязательно следует установить значение свойства Flags равным 1, 2 или 3 (см. пособие , стр. 183).
Вариант 2 . С помощью элемента управления Common Dialog реализовать команды меню Edit (подменю Copy , Cut и Paste ), назначением которых является копирование или удаление в буфер обмена выделенного фрагмента текста, а также вставка в выделенное место текста содержимого буфера обмена.
Указание: К буферу обмена (объекту Clipboard ) можно применять методы SetText и GetText:
Clipboard. SetText RichTextBox1.SelText
RichTextBox1.SelText = Clipboard. GetText
Каждая программа должна сохранять данные на диск и читать их с диска. Это необходимо, например, для сохранения настроек программы, вряд ли пользователю понравится программа, которую при следующем запуске придется настраивать заново.
В данной статье речь пойдет о работе с текстовыми файлами средствами Visual Basic.
Дескриптор файла
Для работы с файлами операционная система использует каналы ввода/вывода, т.е. каждый открытый файл имеет свой номер.
В Visual Basic существует функция FreeFile , которая возвращает номер свободного канала, который можно использовать для работы с файлом. Если свободных каналов нет, то возникает ошибка.
FreeFile [ (RangeNumber ) ]
RangeNumber -необязательный параметр, который позволяет определить диапазон значений свободных каналов, если RangeNumber = 0 (по умолчанию), то возвращается номер канала из диапазона 1 - 255, а если 1, то из диапазона 256 - 511.
MyFile = FreeFile " Переменной MyFile присвоен свободный канал и теперь ее можно использовать для работы с файлами
Работа с текстовыми файлами
Наиболее часто приходится встречаться с текстовыми файлами. Текстовые файлы состоят из набора символов ASCII (American Standard Code for Information Interchange - Американский стандартный код для обмена информацией).
Прежде чем начать записывать/считывать данные, файл необходимо открыть, делается это при помощи оператора Open (Имя_файла ) For As # Номер_файла , где:
Input - открыть файл для чтения, если файл не существует, то возникает ошибка;
Output - для записи, если файл не существует, то он будет создан, а если файл существует, то он будет перезаписан;
Append - для добавления, если файл не существует то он будет создан, а если файл существует, то данные будут добавляться в конец файла.
Чтение текстовых файлов можно производить двумя способами: читать посимвольно, для этого используется функция Input(Количество_считываемых_символов , #Номер_файла ) и построчно, для этого используется функция Line Input # Номер_файла , Куда_считывать .
Dim MyFile
Dim S As String "Переменная для хранения считанных данных
MyFile = FreeFile
Open ("C:\TEST.txt") For Input As #MyFile
Line Input #MyFile, S "Считываем первую строку из файла TEST.TXT в переменную S
Dim MyFile "Объявляем переменную для свободного файла
Dim i As Integer "Переменная для цикла
Dim tS As String "Переменная для считывания строк
Dim S As String "Переменная для хранения окончательных данных
MyFile = FreeFile " Присваиваем свободный канал, для работы с файлами
"Открываем файл TEST.TXT для чтения
For i = 1 To 5
Line Input #MyFile, tS "Читаем файл TEST.TXT построчно
If i => 5 Then S = tS "Если пятая строка, то запоминаем ее в переменную S
Next i
Close #MyFile "Закрываем файл
Dim MyFile "Объявляем переменную для свободного файла
Dim S As String "Переменная для хранения считанных данных
MyFile = FreeFile " Присваиваем свободный канал, для работы с файлами
Open ("C:\TEST.txt") For Input As #MyFile "Открываем файл TEST.TXT для чтения
S = Input$(LOG(1), 1) "Считываем весь файл в переменную S
Close #MyFile "Закрываем файл
Для записи в файл существуют операторы Print # Номер_файла , Данные и Write # Номер_файла , Данные . Отличает эти операторы только то, что Write записывает данные в кавычках, а Print без кавычек.
Ниже следующий код создаст на диске C:\ новый файл TEST.TXT и запишет в него две строки, первую без кавычек, а вторую в кавычках:
Dim MyFile "Объявляем переменную для свободного файла
MyFile = FreeFile " Присваиваем свободный канал, для работы с файлами
Open ("C:\TEST.txt") For Output As #MyFile "Открываем файл TEST.TXT для записи
Print #MyFile, "Эта строка записана оператором Print, она без кавычек…"
Write #MyFile, "Эта строка записана оператором Write, она в кавычках…"
Close #MyFile "Закрываем файл
Вот собственно и все. Как вы уже наверно поняли, для закрытия файла служит оператор Close # Номер_файла , при этом, # Номер_файла указывать не обязательно.
Статья немного сыровата, но для начинающих программистов будет полезна. В следующий раз я расскажу о работе с бинарными файлами.
Данные символьного типа
Под каждый символ в памяти компьютера выделяется 1 байт (8 бит) памяти в ASCIIкодировке(либо два байта вUnicode). Кодовые таблицы содержат по 256 символов. Первые кодысномера 0 по 127 в любой кодировке одинаковы. С номера 0 по 31 – управляющие символы, номер32 – пробел. Далее символы: с 48 по 57 - цифры от 0 до 9, с 65 по 90 – заглавные буквы латинского алфавита, с 97 по 122 – малые буквы латинского алфавита. В промежутках - знаки. Позиции таблицы со128 по 256 используются для национальных символов различных языков.
Символьные данные можно сравнивать друг с другом, используя те же операции сравнения, что и с данными арифметического типа. Сравнение происходит посимвольно (побайтно) слева направо. Фактически сравниваются соответствующие коды символов.
Для обработки символьных данных можно использовать операцию сцепления операндов (знак операции – символ «+» или &).
Строку символов всегда можно преобразовать в одномерный массив отдельных символов, расщепив его при помощи функции MID илиSplit . После обработки массива, его элементы следует обратно слить в строку при помощи операции сцепления & (Конкатенации).
Решение подавляющего большинства задач требует владения встроенными функциями VB6
Функция |
Выполняемые действия |
Пример |
Определяет длину указанной символьной переменной в байтах (количество символов) |
Fio=”Иванов” |
|
Вырезает из переменной х слеваk символов. Вырезанные символы можно присвоить другой переменной |
Fio=”Иванов” T=”Иван” |
|
Аналогично предыдущей функции, только справа |
Fio=”Иванов” |
|
Вырезает k символов из переменнойx , начиная с позицииpos , включительно |
Fio=”Иванов” T=”вано” |
|
х в десятичное число. | ||
Преобразует указанную символьную переменную х в целое число | ||
Преобразует число y в строку символов. С учетом знака. Если число положительное, вместо знака ставится пробел |
s=”-678 123.45” |
|
Результат – символ, соответствующий указанному номеру в таблице символов |
Вывод заглавных букв латинского алфавита |
|
Определяет числовой код первого символа в строке х |
Print ASC(”123”) Print ASC(” 1a2m”) Print ASC(”ABC”) На экране 49 32 65 |
|
Начиная с позиции n , определяет позицию первого появления подстрокиy в строкеx . Если не находит, то результат 0. |
x=”кукуруза” Print INSTR(1,x,y); Print INSTR(2,x,y); На экране 1 3 |
|
Возвращает копию строки х после удаления символов пробела из левой части строки (начальные пробелы) | ||
Возвращает копию строки х после удаления символов пробела из правой части строки (конечные пробелы) | ||
Возвращает копию строки х после удаления начальных и конечных пробелов | ||
Возвращает копию строки х со всеми символами верхнего регистра, преобразованными в символы нижнего регистра | ||
Возвращает копию строки х со всеми символами нижнего регистра, преобразованными в символы верхнего регистра | ||
Изменяет регистр букв символьной строки, в зависимости от значения параметра Р Р=1, верхний регистр Р=2, нижний регистр Р=3, только первая заглавная | ||
Изменяет порядок следования в строке на обратный | ||
Возвращает строку пробелов длиной nсимволов | ||
REPLASE(S, S1, S2, n, k) |
Заменяет в строке SподстрокуS1 на подстрокуS2, начиная с позицииn,k- количество замен, если не указано, то заменяются все вхожденияS1. |
print Replace(s1,”1”,””,1) На экране 23 |
Функция Split
Новая функция, которая появилась в Visual Basic 6.0. Функция Split используется для расщепления строки на подстроки с использованием разделителя подстрок. Возвращает одномерный массив с типом данных Variant(String), содержащий в качестве элементов найденные подстроки.
Split(Expression,,,)
Expression - Обязательный аргумент - строка, которую нужно расщепить. Если аргумент содержит нулевую строку(""), то возвращается пустой массив, т.е. массив без элементов и данных.
Delimiter - Необязательный аргумент - символы типаString , которые используются в качестве разделителя строки. Если аргумент опущен, то по умолчанию используется символ пробела (" "). Если же аргумент содержит нулевую строку(""), то возвращается одноэлементный массив, содержащий целую строку.
Limit - Необязательный аргумент, содержащий число возвращаемых подстрок. Если аргумент опущен или равен -1, то обрабатывается вся строка.
Compare - Необязательный аргумент - числовая константа, определяющая вид сравнения.
Функция Join
Функция, выполняющая обратное действие – объединение элементов массива в строку, используя указанный разделитель.
Join (name_array, )
Пример . Дан текст. Определить количество предложений. Найти количество слов, начинающихся с буквы «п».На форме в поле Text1 – располагается исходный текст, в поле Text2 – количество предложений, в поле Text3 – количество слов, начинающихся на букву п.
Private Sub Command1_Click()
s1$ = "Привет, Поль! С праздником! С наилучшими пожеланиями Питер."
a$ = Mid(s1, i, 1)
If (a = ".") Or (a = "?") Or (a = "!") Then kp = kp + 1
For i = 1 To ns - 2
If Mid(s1, i, 1) = "П" Or Mid(s1, i, 1) = "п" Then ks = ks + 1
If Mid(s1, i, 2) = " П" Or Mid(s1, i, 2) = " п" Then ks = ks + 1
Text2.Text = Str(kp)
Text3.Text = Str(ks)
Private Sub Command2_Click()
Оператор Mid
Синтаксис
Mid(stringvar, start [, length]) = string,
где stringvar- имя строчной переменной для модификации,
start - позиция символа вstringvar, с которой начинается заменяемая часть строки,
length - число заменяемых символов,
string - строковое выражение для замены.
Mid(s1, 9) = "Жиль"
Число заменяемых символов всегда меньше или равно числу символов в stringvar.
Не следует путать этот оператор с одноименной функцией!
Файлы
В зависимости от организационной структуры информации в файле,способа хранения и доступа к этой информации принято выделять три типа файлов:
Файлы последовательного доступа . Как правило, это текстовые файлы. Структурной единицей таких файлов является строка. Данные в них хранятся в виде цепочкиASCIIкодов и могут обрабатываться любым текстовым редактором. Запись и считывание данных при работе с такими файлами происходит строго последовательно (нельзя получить доступ ко второй записи, не прочитав первой).
Файлы произвольного доступа . Это структурированные файлы, которые содержат информацию в виде записей. Например, файлы баз данных. Компоненты (поля) в записях таких файлов могут иметь разные типы. Но все записи файлов последовательного доступа имеют постоянную длину и порядковый номер. Это позволяет получить доступ сразу к нужной записи без последовательного просмотра всех предыдущих.
Бинарные (двоичные) файлы . Это могут быть файлы последовательного доступа, но информация в них представлена в виде байтов или блоков байтов. К таким файлам можно отнести файлы с расширениемexe, т.е. программные. Это могут быть файлы произвольного доступа: размер записи у них всегда равен 1 байту, и любой байт можно считать по его порядковому номеру.