Добавление данных к файлу. Создание объекта FileSystemObject

Windows

Цель работы: Изучение и использование операторов языка 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 бит) памяти в AS­CIIкодировке(либо два байта в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 байту, и любой байт можно считать по его порядковому номеру.