Тема 6. Данные и файлы. Хранение данных в файлах

            Цель занятия: освоить применение операторов для организации записи и считывания данных из файла.

В Visual Basic 6 существует понятие типа файла, который определяется организационной структурой хранения информации и способом доступа к этой информации. Принято выделять следующие типы файлов: файлы последовательного доступа; файлы произвольного доступа; двоичные (бинарные) файлы с побайтным доступом. Каждый тип файла имеет свои особенности, однако, есть два действия, которые являются общими для любого типа файла. Общими действиями в программе при работе с файлами являются – открытие и закрытие файла. Следует напомнить, что при работе с Windows, пользователь находит в каталоге необходимый файл и запускает его. Точно также  открытие файла (Open) для записи или чтения в программе, требует указать путь к файлу. Работать можно одновременно с несколькими открытыми файлами, поэтому в языках программирования каждому открытому файлу присваивается  условное обозначение, которое называется дескриптором файла. Когда работа с файлом заканчивается, то следует выполнить операцию закрытия файла (Close), в которой указывается дескриптор, закрываемого файла. Наиболее распространённым типом файла, с которым работает пользователь, является файл с последовательным доступом. Удобством таких файлов является то, что в них можно последовательно добавлять информацию, осуществлять поиск информации, удалять любую запись. Операторы языка VB, предназначенные для работы с последовательными файлами, имеют определённый синтаксис. Открытие файла: Open Имя файла For режим работы As #дескриптор файла

Имя файла: можно задать полный путь к файлу, например,

C:\Pavlov\VB\Primer\Dann.txt”, если файл находится в том же каталоге, где расположено приложение, то достаточно указать только имя файла, например, “Dann.txt”. Можно заранее переменной присвоить имя файла, а в операторе Open вместо имени файла указать имя переменной.

Режим работы – это одно из трёх ключевых слов:

·      Output – если файл открывается для записи в него данных, начиная с первой позиции (вся имеющаяся информация в нём будет стёрта).

·      Append – если файл открывается для записи, то данные будут добавляться к концу (вся предыдущая информация будет сохранена).

·      Input – открытие файла для чтения.

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

Закрытие файлов: Close # Список дескрипторов

Между операторами открытия и закрытия файла должны находиться операторы работы с данными (поиск, преобразование, выполнение логических и арифметических операций), но самое главное надо помнить, что файл открывается либо для чтения, либо для записи. Запись данных в файл можно осуществлять двумя способами:

1.             С помощью оператора Write, синтаксис этого оператора:

Write  #Дескриптор файла, Список значений

Дескриптор файла целое число, совпадающее с дескриптором файла в операторе Open.

Список значений – это записанные через запятую значения, которые указаны в виде переменной в программе. Каждый элемент этого списка записывается в одну текстовую строку, если встречаются элементы типа String, то они будут заключены в кавычки.

2.             С помощью оператора Print, синтаксис записи:

Print  #Дескриптор файла, Список значений

В операторе Print элементы Список значений должны быть разделены либо точкой с запятой (;), тогда значения будут записываться в файл подряд без разделителей, либо используют запятую (,), что обозначает выделение 14 символьной зоны для хранения данных в файле.

При выборе режима Input - чтение из файла, необходимо соблюдать следующий синтаксис:

 Input  #Дескриптор файла Список переменных

Список переменных – это записанные через запятую переменные любого типа. Чаще всего количество записей в файле неизвестно, поэтому чтение из файла осуществляется с помощью оператора цикла с условием, конструкция которого может быть: Do WhileLoop или Do UntilLoop.

 

Порядок выполнения работы

Воспользуемся уже существующими наработками, которые позволяют вводить данные в текстовые окна и контролировать правильность их ввода. Откроем проект Pril2.vbp, сохраним его под новым именем – Pril6.vbp, внесём в проект дополнительный элемент управления – командная кнопка с именем C2 и назовём её – «Посмотреть данные», а уже существующей кнопке с именем C1 изменим текст на - «Записать в файл». В общем виде новое приложение должно выполнять следующие функции:

- позволять вводить данные в текстовые окна (как было ранее – это сведения о товаре);

- записывать в файл сведения о товаре (наименование, количество, цена за шт.) при нажатии на командную кнопку «Записать в файл»;

- открывать файл для просмотра данных в окне списка, после того, как будет нажата командная кнопка «Посмотреть данные».

Внешний вид формы проекта Pril6, будет выглядеть, как показано на рис. 26.

 

Рис. 26. Интерфейс пользователя для ввода данных, записи в файл и просмотра содержимого файла в окне списка

Можно посмотреть, как работает приложение

 

            Следует напомнить, что при использовании технологии копирования уже имеющегося проекта, на базе которого строится новый проект, элементы управления сохраняют свои имена и свойства. Поэтому, в проекте «Работа с файлами» у командной кнопки с именем C1 изменим запись в свойстве Caption на новое – «Сохранить в файле». Программные коды частично изменим, в частности, понадобится воспользоваться конструкцией операторов для открытия нового файла и записи в него текущей строки данных. Так как, предполагаем, что пользователь сам будет принимать решение, какой режим выбрать (записать в файл или просмотреть содержимое файла), то в качестве указания режима записи, используем ключевое слово Append (открыть файл и записать данные в конец). Чтобы знать, где потом искать файл, укажем полный путь к файлу, например,

Open "C:\Pavlov\VB\Primer\Dann.txt" For Append As #1

Предположим, что в одном файле мы хотим хранить сведения о виде товара и его цене, которые были введены в текстовые окна, тогда конструкция поддержки записи данных в файл будет состоять из следующих строк:

Open "C:\Pavlov\VB\Primer\Dann.txt" For Append As #1

   Print #1, Tovar, Cena

 Close #1

Полный код программы обработки события C1_Click() – нажать на командную кнопку «Записать в файл», представлен на рис. 27.

 

Рис. 27. Программный код обработки события - нажать на командную кнопку «Записать в файл»

 

            В программе встречается оператор MsgBox, в котором использована функция Chr(13), позволяющая преобразовать числовой код в символ перехода на новую строку. На рис. 28 представлено диалоговое окно, в котором сообщение для пользователя располагается в двух строках.

MsgBox "Данные записаны в файл" & Chr(13) & "с именем: Dann.txt"

 

Рис. 28. Сообщение пользователю о завершении записи данных в файл

 

            Имя файла, в котором будут собираться данные о наименовании товара и его суммарной стоимости, определено в программе, как: Dann.txt. Для того чтобы увидеть, как записаны данные в файл, можно воспользоваться приложением «Блокнот» (рис. 29).

 

Рис. 29. Отображение результата записи данных в файл

 

            Вторая задача, которая возложена на приложение – это просмотр содержимого файла в окне списка. Выполняется такая задача при нажатии на кнопку с именем C2 «Посмотреть данные». Проблемой чтения данных из файла является та, что неизвестно количество записей, сделанных во время сеанса работы пользователя с приложением. Чаще всего чтение из существующего текстового файла производится циклически, с помощью оператора цикла с условием DO UntilLup. Условием окончания цикла является попытка прочитать данные после чтения последней текстовой строки. При записи файла, когда файл закрывают оператором Close, автоматически устанавливается специальный символ – конец файла. В VB существует специальная функция EOF() – конец файла[1]. Единственным аргументом функции является дескриптор файла, открытого для чтения. Код программы обработки события при нажатии на кнопку с наименованием «Посмотреть данные» представлен на рис. 30.

 

Рис. 30. Программный код обработки события – нажать на кнопку «Посмотреть данные»

 

Первый оператор L1.Visible = True (рис. 30) присваивает свойству Visible (видимость) значение True (Да), чтобы сделать на форме приложения видимым окно списка с именем L1. В операторе Open в качестве режима использовано ключевое слово Input (открыть для чтения), дескриптор файла имеет значение 11 (ранее было сказано, что это может быть любое целое число). В операторе цикла с условием Do Until EOF(11) использована функция EOF(11), в которой в качестве аргумента указан дескриптор файла. Следующие три оператора находятся внутри цикла, который будет выполняться до тех пор, пока не будет встречена запись – конец файла. Обратите внимание, что в операторе Input  #11, Rezult$ после указания дескриптора файла стоит запятая, а затем указывается переменная, в которую будут переданы строка с одной записью из файла. В файле Dann.txt находятся текстовые записи. Переменную Result не объявляли в операторе Dim, поэтому, всегда следует давать указание, что переменная должна иметь тип записи String (текст), что соответствует добавления префикса – знак $. Оператор L1.List(i%) = Rezult обеспечивает передачу текстовой строки из переменной Rezult в окно со списком (L1). Свойство списка List(i%) обеспечивает добавлять в список новую строку, которая должна иметь порядковый номер (индекс), поэтому, имя индекса обозначено переменной i с префиксом – целое число % (напомним, что переменную i специально не объявляли в операторе Dim). Для изменения индекса используем оператор присвоения i = i + 1.

 

Задание для самостоятельной разработки

            Разработайте новое приложение, которое позволяет накапливать в списке сведения о товарах, проводить удаление необходимых строк из списка, затем откорректированный список сохранять в файле последовательного доступа. Кроме того, предусмотрите возможность просматривать в отдельности сведения о товаре, читая их из файла.

 

Вопросы для самопроверки

1.        В каком виде можно записать имя файла в операторе Open, можно ли не указывать полный путь к файлу?

2.        Какие существуют ключевые слова для определения режима работы с файлами в языке Visual Basic?

3.        В чём заключается логика работы оператора цикла с условием типа Do UntilLop, какие изменения потребуется провести в программе, если использовать оператор цикла типа Do WhileLoop?

4.        Можно ли использовать переменные внутри процедур, если их тип данных не был определен в операторе Dim, где ставится префикс для переменной, чтобы явно указать её тип?

 



[1]  Имя функции EOF составлено из первых букв словосочетания end of file.

Hosted by uCoz