Практическая работа по теме Приемы работы с различными источниками данных 1 Задание Элементы управления MainMenu, OpenFileDialog и SaveFileDialog 1




Скачать 329.88 Kb.
страница3/6
Дата14.07.2016
Размер329.88 Kb.
1   2   3   4   5   6

Задание 3. Запись данных в текстовый файл

Задача


Рассмотреть стандартные средства VB.NET для записи данных в текстовые файлы. Данные представляют собой строки разной длины, отделенные друг от друга двумя специальными символами – возвратом каретки и переводом строки.

Решение


Использовать стандартные процедуры FileOpen(), Print(), PrintLine(), FileClose() для выполнения операций по открытию, записи и закрытию текстового файла.

Обсуждение


Для записи в файл текстовых строк файл должен быть открыт для записи методом FileOpen(), но с другим значением параметра WorkMode: OpenMode.Output при создании нового файла или OpenMode.Append для до записи в конец существующего файла:

FileOpen(filenumber, filename, OpenMode.Output)

FileOpen(filenumber, filename, OpenMode.Append).

Не путайте режимы OpenMode.Output и OpenMode.Append. Если вы откроете существующий файл в режиме OpenMode.Output, то все его старое содержимое будет уничтожено! Возможно, вы именно этого и хотите, но если ваша задача – дописать что-то в конец файла, то следует использовать режим OpenMode.Append.

Для записи данных в текстовый файл используются процедуры Print() и PrintLine(). Синтаксис процедур следующий:

Print(filenumber, var)

PrintLine(filenumber, var)

Конструкции означают – «записать строку из переменной var в файл с номером «filenumber». Процедура PrintLine() отличается от Print() тем, что вставляет после значения var символы – возврат каретки и перевод строки. Таким образом, код

Print(1, “ABC”)

Print(1, “DEF”)

выведет в файл с номером 1 строку ABCDEF, а код –

PrintLine (1, “ABC”)

PrintLine (1, “DEF”)

выведет две отдельные строки – ABC и DEF.

После окончания работы с файлом его следует закрыть при помощи процедуры FileClose(filenumber), где filenumber – файловый номер, присвоенный файлу при его открытии процедурой FileOpen.

Самостоятельно


Продолжим работу с приложением, созданным в задании 1. Добавьте в меню формы для чтения текстовых файлов команды для сохранения файла в режиме PrintLine и Print. Для указания имени файла используйте стандартный диалог SaveFileDialog (не забудьте переместить соответствующий элемент управления в форму).

Проверьте, как работают константы OpenMode.Output и OpenMode.Append. Используйте для этого разные пункты в меню.

В качестве примера ниже приведен код записи в текстовый файл методом PrintLine.

Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem4.Click

Dim fname As String

If SaveFileDialog1.ShowDialog = DialogResult.OK Then fname = SaveFileDialog1.FileName

FileOpen(1, fname, OpenMode.Output)

PrintLine(1, RichTextBox1.Text())

FileClose(1)

End Sub

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

Задача


Рассмотреть стандартные средства VB.NET для записи данных в типизированные файлы, состоящих из набора однотипных записей.

Решение


Использовать процедуры FileOpen, FileGetObject, FilePutObject, FileClose для выполнения операций по открытию, записи и закрытию типизированного файла.

Обсуждение


Типизированные файлы состоят из набора однотипных записей. Для открытия типизированного файла в качестве режима работы необходимо указать OpenMode.Random (и для чтения, и для записи). Кроме того, можно задать значение необязательного параметра RecordLength. Параметр RecordLength – размер записи в байтах, из которых состоит файл. Оператор, открывающий типизированный файл должен иметь следующую структуру

FileOpen(filenumber, filename, workMode, OpenAccess, OpenShare, RecordLength), три последних параметра являются необязательными, синтаксис может быть сокращен до указания только обязательных параметров:

FileOpen(filenumber, filename, OpenMode.Random), но лучше все параметры, особенно длину записи указывать явно, например:

FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Write, OpenShare.Default, 39).

При работе с типизированными файлами для чтения и записи данных используются процедуры FileGetObject() и FilePutObject(). Синтаксис этих процедур следующий:



FileGetObject(filenumber,var, recnumber) – чтение записи из типизированного файла;

FilePutObject(filenumber, var, recnumber) – запись в типизированный файл, где

Filenumber – целый положительный файловый номер, назначается программистом, удаляется при закрытии файла методом FileClose(filenumber);

Var – переменная для записи строки типизированного файла;

Recnumber – номер записи в файле, первая запись имеет номер 1, вторая – 2, и так далее; лучше если номер записи создается программистом явным образом.

Процедура FileGetObject() считывает в переменную var запись с номером recnumber из входного файла filenumber (первая запись имеет номер 1).

Процедура FilePutObject() записывает в файл значение переменной var. Если параметр recnumber не указан, то операция будет производиться с текущей записью.

Рассмотрим практический пример использования типизированных данных. Напишем простейшую программу, которая иллюстрирует обычное применение типизированного файла – хранение картотеки туристического агентства, состоящей из одинаковых по своей структуре записей. Ограничимся тремя функциями: добавлением любой записи в картотеку; просмотром любой записи по введенному номеру, последовательным перебором записей.

Пусть картотека хранит следующую информацию о туристе: фамилию туриста, пол, возраст, выбранный тур (рис. 5.8). Типизированная запись представляет собой набор следующих полей: фамилия – 20 символов, пол – 1 символ, возраст – 2 символа, название тура – 10 символов.

В документации по VB.NET сказано, что при записи строки в файл методом FilePutObject() происходит добавление к каждой записи еще четырех служебных символов. Таким образом, длина каждой записи в нашем файле 33+4=37 символов.

В рассмотренном ниже примере для хранения списка туров используется обычный текстовый файл, в каждой строке которого хранится название тура. Список отображается в приложении с помощью элемента управления ComboBox. Чтение из файла выполняется методом LineInput(), который распознает последовательность символов: конец строки и перевод каретки, как символы разделения строк. Таким образом, длина записи в нашем файле 37+2=39 символов (2 символа появились в записи за счет символов конца строки и перевода каретки, которые имеются в каждой строке текстового файла с названиями туров).



Рис. 5.8. Проектирование интерфейса приложения

Теперь рассмотрим код приложения подробнее. Объявим глобальную (на уровне формы) переменную для хранения текущего номера записи:

Dim number As Integer

Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

FileOpen(1, "L:\1.txt", OpenMode.Input)

Dim s As String

While Not EOF(1)

s = LineInput(1)

ComboBox1.Items.Add(s)

End While

FileClose(1)

End Sub




В текстовом файле (здесь L:\1.txt) хранится информация о названиях туров. Отображение данных о турах выполняется с помощью ComboBox.

Код для командной кнопки «Добавить» выглядит следующим образом:



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim str, s As String

s = TextBox1.Text

str = s + Space(20 - s.Length)

If RadioButton1.Checked Then str &= "ж" Else str &= "м"

str &= TextBox2.Text

s = ComboBox1.SelectedItem

str &= s + Space(10 - s.Length)

FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Write, OpenShare.Default, 39)

FilePutObject(1, str, 1 + LOF(1) / 39) ' Длина записи + 4 при записи строки +2 от строки из списка

FileClose(1)

TextBox1.Text = ""

TextBox2.Text = ""

ComboBox1.SelectedIndex = -1

FileClose(1)

End Sub


В этом обработчике события вам не знакомы две функции: Space() и LOF(). Название функции Space (пробел) показательно, функция создает указанное число пробелов: Space(20 - s.Length) – в данном случае столько, сколько не хватает до числа 20. Этот прием позволяет дополнить строку с введенной фамилией до 20 символов (поле имеет фиксированную длину, мы договорились, что для хранения фамилии длина поля будет 20 символов).

Еще одна незнакомая функция – LOF (length of file – длина файла) – возвращает длину указанного файла в байтах.

Разберем программный код для записи сформированной строки в файл: FilePutObject(1, str, 1 + LOF(1) / 39).

Первые два параметра метода указывают номер файла, открытого для записи и переменную, в которой хранится строка для записи в файл.

Третьим параметром является номер записи, формируемый явным образом: функция LOF(1) возвращает длину файла (в байтах), разделив эту длину на длину записи (у нас, 39) мы получим число записей в файле. Новая запись, естественно, будет больше на 1, чем последняя запись файла.

Таким образом, происходит запись данных в файл. Данные при этом имеют фиксированную структуру, как для каждого поля, так и для всей записи (рис. 5. 9).



Рис. 5.9. Структура типизированного файла

Рассмотрим код командной кнопки «Просмотреть по номеру».

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

Dim str As String

Dim n As Integer = CType(TextBox3.Text, Integer)

FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Read, OpenShare.Default, 39)

If n > (LOF(1) / 39) Then number = 1

FileGetObject(1, str, n)

FileClose(1)

Label5.Text = str.Substring(0, 19)

If str.Substring(20, 1) = "ж" Then RadioButton3.Checked = True Else RadioButton4.Checked = True

Label7.Text = str.Substring(21, 2)

Label9.Text = str.Substring(23, 10)

End Sub


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

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim str As String

FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Read, OpenShare.Default, 39)

If number <= (LOF(1) / 39) Then number += 1 Else number = 1

FileGetObject(1, str, number)

FileClose(1)

Label5.Text = str.Substring(0, 19)

If str.Substring(20, 1) = "ж" Then RadioButton3.Checked = True Else RadioButton4.Checked = True

Label7.Text = str.Substring(21, 2)

Label9.Text = str.Substring(23, 10)

End Sub




Для обратного перемещения:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim str As String

FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Read, OpenShare.Default, 39)

If number <= 1 Then number = 1 Else number -= 1

FileGetObject(1, str, number)

FileClose(1)

Label5.Text = str.Substring(0, 19)

If str.Substring(20, 1) = "ж" Then RadioButton3.Checked = True Else RadioButton4.Checked = True

Label7.Text = str.Substring(21, 2)

Label9.Text = str.Substring(23, 10)

End Sub

Окончательный вид приложения показан на рис. 5. 10.

Рис. 5.10. Приложение «Туристическая фирма»


Самостоятельно


Внесите дополнительную информацию о туристе: наличие/отсутствие загранпаспорта, едет один или с детьми, сданы/ не сданы фотографии на визу, сроки и стоимость тура, вычисление полной стоимости тура со стоимостью визы и медицинской страховкой (один день – один евро).
1   2   3   4   5   6


База данных защищена авторским правом ©uverenniy.ru 2016
обратиться к администрации

    Главная страница