ПОНЯТНО О Visual Basic NET (том 3)

       

Типизированные файлы «Старый» доступ к файлам


Кто разбирался в Задание 136 про жителей города и Задание 137 про мэрию, тот понимает, что исправление какой-то информации в текстовом файле, содержащем базу данных из 10000 записей, дело долгое, так как, чтобы исправить запись № 9001, нужно прочесть все 10000 записей, а затем вновь записать все 10000 записей. Поэтому никто не хранит базы данных в текстовых файлах. Для этого удобно применять так называемые типизированные файлы. Рассмотрим пример.

Задание. В стране спортом занимаются 4 миллиона спортсменов (мы для простоты возьмем 4 спортсмена). Про каждого спортсмена известны:

  • Фамилия
  • Дата рождения
  • Пол
  • Вес
  • Требуется:

    Создать файл с пронумерованными записями этой информации обо всех спортсменах страны

    Процедуру чтения всех записей из файла

    Процедуру чтения записи с указанным номером

    Процедуру исправления записи с указанным номером

    Создадим структуру

    Structure типСпортсмен

            Dim Фамилия As String



            Dim Дата As DateTime

            Dim Мужчина As Boolean

            Dim Вес As Integer

    End Structure

    Поле Мужчина равно True если спортсмен мужчина, и False – если женщина.

    Создадим массив структур для всех спортсменов страны:

    Dim Сп(4) As типСпортсмен

    Разместите на форме 4 кнопки.

    Создаем файл с записями обо всех спортсменах страны:

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

            'Создаем в памяти компьютера информацию о всех спортсменах:

            Сп(1).Фамилия = "Волков"             : Сп(1).Дата = #12/30/1974#     : Сп(1).Мужчина = True       : Сп(1).Вес = 72

            Сп(2).Фамилия = "Медведев" : Сп(2).Дата = #1/4/1942#   : Сп(2).Мужчина = True    : Сп(2).Вес = 96

            Сп(3).Фамилия = "Лисицина"   : Сп(3).Дата = #10/14/1981#     : Сп(3).Мужчина = False            : Сп(3).Вес = 60

            Сп(4).Фамилия = "Зайцев"             : Сп(4).Дата = #11/29/1978#     : Сп(4).Мужчина = True       : Сп(4).Вес = 48

            'Записываем эту информацию в файл:


    После завершения работы с файлом его нужно закрыть процедурой FileClose. Ее параметр – номер закрываемого файла.

    Итак, после выполнения процедуры мы будем иметь файл, в котором друг за другом идут 4 записи:  Сп(1),  Сп(2),  Сп(3),  Сп(4). Компьютер способен определять их порядковые номера в файле, несмотря на то, что они нигде физически в файле не записаны. Внутри каждой записи присутствует информация о конкретном спортсмене страны. Никаких символов возврата каретки в файле нет и чтобы понять, где кончается одна запись и начинается следующая, компьютер пользуется другими критериями.

    Процедура FilePut (как и нижеописанная FileGet) может применяться для работы не только со структурами, но и с простыми типами данных, например, с числами конкретного типа или строками. В этом случае файл будет представлять собой цепочку чисел одного типа или строк.

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

    Читаем все записи. Вот процедура чтения всех записей из файла:

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

            FileOpen(1, "E:\Папка\База.gor", OpenMode.Random)

            Dim i As Integer

            For i = 1 To 4

                FileGet(1, Сп(i))

            Next

            FileClose(1)

    End Sub

    Пояснения: Осуществляет чтение информации из файла с произвольным доступом процедура FileGet. Первый ее параметр – номер файла, а второй – переменная, в которую посылается значение, считанное из файла. В нашем случае это Сп(i) – структура информации об очередном спортсмене. Мы можем указать и третий параметр – номер записи в файле, которую хотим считать, но у нас он не указан, поэтому записи будут считываться подряд одна за другой, как при считывании информации из текстового файла.

    Читаем одну запись. Поместим на форму 5 текстовых полей. В текстовое поле 1 мы будем вводить номер интересующей нас записи в файле. Остальные 4 поля предназначены соответственно для фамилии, даты рождения, пола и веса спортсмена.



    Вот процедура чтения из файла одной нужной нам записи с указанным номером:

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

            Dim Спортсмен As типСпортсмен

            Dim Номер As Integer = CInt(TextBox1.Text)

            'Считываем из файла информацию об одном спортсмене:

            FileOpen(1, "E:\Папка\База.gor", OpenMode.Random)

            FileGet(1, Спортсмен, Номер)

            FileClose(1)

            'Отображаем информацию об одном спортсмене:

            TextBox2.Text = Спортсмен.Фамилия

            TextBox3.Text = Спортсмен.Дата

            TextBox4.Text = Спортсмен.Мужчина

            TextBox5.Text = Спортсмен.Вес

        End Sub

    Пояснения: Создаем рабочую переменную Спортсмен типа структуры типСпортсмен. Пусть нас интересует информация, хранящаяся в файле в записи №3. Мы вводим число 3 в поле TextBox1. Функция CInt на всякий случай преобразует то, что мы ввели, в тип Integer. Результат присваивается переменной Номер. В процедуре FileGet мы указали параметр Номер, поэтому она считывает из файла в переменную Спортсмен запись с номером 3. Обратите внимание – записи 1 и 2 не считываются, время на них не тратится, компьютер сразу «прыгает» к записи 3. В текстовых полях появляется информация о спортсмене №3.

    Исправляем одну запись. Вот процедура исправления записи с указанным номером:

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

            Dim Спортсмен As типСпортсмен

            Dim Номер As Integer = CInt(TextBox1.Text)

            'Создаем в памяти компьютера информацию об одном спортсмене:

            Спортсмен.Фамилия = TextBox2.Text

            Спортсмен.Дата = CDate(TextBox3.Text)

            Спортсмен.Мужчина = CBool(TextBox4.Text)

            Спортсмен.Вес = CInt(TextBox5.Text)

            'Записываем эту  информацию в файл:

            FileOpen(1, "E:\Папка\База.gor", OpenMode.Random)

            FilePut(1, Спортсмен, Номер)

            FileClose(1)



        End Sub

    Пояснения: Пусть мы хотим исправить в файле запись №2.  Вводим число 2 в поле TextBox1. В остальные четыре текстовые поля вводим вручную информацию о спортсмене, затем нажимаем кнопку – и информация оказывается в файле в записи №2.

    Функции  CInt,  CDate,  CBool  на всякий случай преобразуют то, что мы ввели, в нужные типы. В процедуре FilePut мы указали третий параметр – Номер, поэтому она записывает значение  переменной Спортсмен в файл в запись с номером 2. Обратите внимание – на запись 1 время не тратится, компьютер сразу «прыгает» к записи 2. То, что было записано в файле в записи 2, стирается, и на это место пишется новая информация.

    Совет: Удобнее исправлять запись о конкретном спортсмене так: Пусть спортсмен №2 похудел и нам нужно исправить в файле только его вес.  Вводим число 2 в поле TextBox1. Щелкаем по 3 кнопке. В текстовых полях появляется информация о спортсмене №2. Исправляем только вес и щелкаем по 4 кнопке. Дело сделано.

    Файлы с произвольным доступом. Мы видим, что информация в типизированных файлах записывается упорядоченно и регулярно, благодаря чему к ней возможен более гибкий и быстрый доступ, чем в текстовых файлах. Эти файлы хорошо приспособлены для хранения массивов простых данных и структур. Здесь уже нет необходимости читать вхолостую начало файла для того, чтобы прочесть что-то в его середине или перезаписывать весь файл, если нужно исправить его маленькую частицу. Поэтому в отличие от файлов с последовательным доступом типизированные файлы причисляют к файлам с произвольным доступом.

    Методы «старого» доступа. Вы вполне можете столкнуться с необходимостью прочесть код, в котором для работы с файлами любого вида используются методы модуля FileSystem пространства имен Microsoft.VisualBasic. Поэтому я для справки привожу примеры обращения к этим методам:

    FileOpen (1, файл, OpenMode.Random)

    Открыть файл для типизированного доступа

    FileOpen (1, файл, OpenMode.Binary)

    Открыть файл для нетипизированного доступа (о нем ниже)

    FileOpen (1, файл, OpenMode.Input)

    Открыть текстовый файл для чтения

    FileOpen (1, файл, OpenMode.Output)

    Открыть текстовый файл для записи

    FileOpen (1, файл, OpenMode.Append)

    Открыть текстовый файл для дозаписи

    FileClose (1)

    Закрыть файл, открытый методом FileOpen

    FilePut (1, переменная, номер)

    Записать переменную в файл с произвольным доступом на место, указанное номером

    FileGet (1, переменная, номер)

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

    Seek (1)

    На какой позиции в файле я нахожусь?

    Seek (1, позиция)

    Переместить головку в файле на указанную позицию

    Write (1, a, b, c, …)

    Записывает в текстовый файл значения переменных a, b, c и так далее. Переменные эти могут иметь разные простые типы. Интересно, что в файле они тоже отделяются друг от друга запятыми, а строковые данные, например, берутся в двойные кавычки.

    WriteLine (1, a, b, c, …)

    То же, что Write, но следующая запись начнется уже с новой строки

    Input (1, a)

    Обычно используется для правильного чтения из текстового файла того, что туда понаписали Write и WriteLine. За один раз читает одно очередное данное и сдвигает головку до следующей запятой или символа возврата каретки..

    Print (1, a, b, c, …)

    Записывает в текстовый файл значения переменных a, b, c и так далее. Переменные эти могут иметь разные простые типы.

    PrintLine (1, a, b, c, …)

    То же, что Print, но следующая запись начнется уже с новой строки

    LineInput (1)

    Считывает из текстового файла очередную строку, какие бы и сколько бы данных в этой строке ни находилось. Обычно используется для чтения того, что записано методами Print и PrintLine.

    InputString (1, число символов)

    Считывает из файла указанное количество символов

    EOF (1)

    Правда ли, что достигнут конец текстового или типизированного файла?

    LOF (1)

    Длина открытого файла в байтах

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


    Содержание раздела