На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: SCINER, B.V.
  
    > Ввод и вывод информации. Файлы , Работа с файлами стандартными средствами Visual Basic
      Здравствуйте Уважаемые!
      Очень много вопросов, по стандарным методам и свойствам VB, таким, как файловый ввод и вывод. Надоело :( .

      Файлы

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

      * получение дескриптора файла (Handle);
      * открытие файла;
      * чтение или запись данных;
      * закрытие файла.

      Дескриптор файла

      Чтобы работать с файлами, нужно понимать, как связывается система или приложение с файлом. Для этого имеется канал ввода/вывода. При открытии файлу ставится в соответствие канал с определенным номером. Таким образом, каждый открытый файл имеет собственный канал, с помощью которого записываются или считываются данные. Следовательно, для ввода и вывода данных в файл имеет значение не имя файла, а номер канала. Кроме того, операционная система должна иметь сведения о наличии свободных каналов, которые можно использовать для открытия файла.

      FreeFile

      Функция Visual Basic FreeFile возвращает номер свободного канала, который можно использовать для работы с файлом.
      ExpandedWrap disabled
        FreeFile[(RangeNumber)]

      Если свободных каналов нет (открыто максимально допустимое количество файлов), возникает ошибка выполнения.
      ExpandedWrap disabled
        intFH=FreeFile

      В этом примере переменной intFH присваивается целое значение, которое можно использовать для открытия файла. Необязательный параметр RangeNumber позволяет определить диапазон значений, из которого выбирается очередной свободный номер канала. Если его значение равно 0 (по умолчанию), то возвращается номер канала из диапазона 1 – 255, если 1, то из диапазона 256 – 511.

      Типы доступа

      В Visual Basic реализованы три типа доступа к файлам:

      * последовательный (Sequential) – для чтения и записи текстовых файлов;
      * произвольный (Random) – для чтения и записи текста или структурированных двоичных файлов с записями фиксированной длины;
      * двоичный (Binary) – для чтения и записи произвольно структурированных файлов.

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

      Последовательный доступ

      Последовательный доступ используется главным образом при работе с текстовыми файлами. Любая информация считывается или сохраняется в текстовом виде построчно. В тексте могут находиться символ перевода строки (vbCrLf или Chr (13) & Chr (10)) или табулятор (Tab или Chr (9)). Эти символы используются для форматирования текста.

      Способ открытия файла с последовательным доступом (для чтения, записи или добавления) задается при вызове оператора Open:

      ExpandedWrap disabled
        Open FileName For [Input | Output | Append] As FileHandle

      Таблица 1. Различные операционные возможности для последовательного доступа.

      Ключевое словоОписание
      InputОткрытие только для чтения из файла
      OutputОткрытие для записи в файл
      AppendОткрытие для добавления к файлу


      Если файл не существует и открывается для чтения (For input), то Visual Basic выдает сообщение об ошибке, а если для записи или добавления (Output или Append), то создается новый файл. Если файл с указанным именем существует, то в режиме Output его содержимое удаляется, а в режиме Append файл открывается для добавления:

      ExpandedWrap disabled
        Open "C:\README.TXT" For Input As intFH1
        Open "C:\DATA\TEXT.TXT" For Output As intFH2
        Open "C:\USERS.TXT" For Append As intFH3


      В конце строки указывается номер канала, возвращаемый функцией FreeFile. В некоторых операционных системах, например в Windows 95/98, можно использовать длинные имена файлов.

      Чтение из файла

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

      * Line lnput# считывает одну строку;
      * Input# считывает последовательность символов, обычно записанных с помощью оператора Write#;
      * Input$ считывает определенное количество символов.

      Существует несколько вариантов чтения всей информации из файла. Перед чтением нужно открыть файл с помощью оператора Open… For:

      ExpandedWrap disabled
        intFH = FreeFile
          Open "С:\Text.Txt" For Input As #intFH
        'Первый вариант
          Do Until EOF(intFH)
            Line Input #intFH, strString
            strText = strText & strString & vbLf
          Loop
         
        'Второй вариант
         StrText = Input$(LOF(intFH), intFH)
         
         Close #intFH


      Оба варианта приводят к одинаковому результату.

      В первом варианте оператор Input выполняется в цикле, пока не будет, достигнут конец файла. Функция EOF (End Of File) возвращает значение True при достижении конца файла. При этом на каждом шаге цикла считывается отдельная строка и к ней добавляется символ конца строки, который отбрасывается оператором Line Input.

      Во втором варианте весь файл считывается функцией Input$. Функция LOF (Length Of File) позволяет определить длину файла в байтах.

      Заметим также, что независимо от вида оператора Input указывается не FileName (имя файла), а только номер канала, т.е. дескриптор файла (intFH).

      Close

      Оператор Close предназначен для закрытия открытого файла или канала.

      Запись в файл

      В Visual Basic для записи информации в файл используются операторы Print# и Write#.

      Print#

      Оператор Print# функционирует почти так же, как его коллега для экрана, с той лишь разницей, что данные не выводятся на экран, а сохраняются в файле, открытом для записи или добавления (Open… For Output или Open… For Append).

      ExpandedWrap disabled
        Print #FileHandle, [(Spase(n)| Tab[(n)]] [Expression] [Charpos]


      Синтаксис оператора на первый взгляд выглядит сложно:

      ExpandedWrap disabled
        Print #intFH, Text1.Text
        Print #intFH, "Фрагмент 1", "Фрагмент 2"
        Print #intFH, "Это составляет "; "единое целое"


      Для форматирования записываемой в файл информации следует по-разному разделять данные в операторе Print. Если в операторе данные разделять запятыми [,], то в файле они будут разделены символами табуляции:

      ExpandedWrap disabled
        Print #intFH, "Фрагмент 1", "Фрагмент 2"
        'соответствует
        Print #intFH, "Фрагмент 1"; Tab; "Фрагмент 2"


      Если же в операторе для разделения данных использовать точку с запятой [;], то данные в файл записываются без разделителей:

      ExpandedWrap disabled
        Print #intFH, "Это составляет "; "единое целое"
        'соответствует
        Print #intFH, "Это составляет единое целое"


      Write#

      Оператор Write# имеет такой же синтаксис, что и Print#. Отличие состоит только в форматировании вывода. Если Print# сохраняет данные в виде обычного текста, то Write# заключает текстовые строки в кавычки, а цифры выводятся без кавычек:

      ExpandedWrap disabled
        Print #intFH, "Анна", "Киев", 17
        'В файле будет: Анна Киев 17
        Write #intFH, "Анна", "Киев", 17
        'В файле будет: "Анна","Киев",17


      Данные, сохраненные с помощью оператора Write#, можно считать оператором Input#.

      Произвольный доступ

      Доступ типа Random Access несколько утратил свое значение после появления в версии Visual Basic 3.0 средств доступа к базам данным. В отличие от последовательного доступа, при котором данные в файлах хранятся в неструктурированном виде, произвольный доступ предполагает, что файл имеет постоянную структуру. Это позволяет считывать данные в произвольном порядке.

      Произвольный доступ реализуется посредством оператора Open.

      ExpandedWrap disabled
        Open FileName For Random [Access] [Lock] As [#]FileHandle [Len=RecLength]


      Параметр Len определяет длину записи. Если это значение меньше, чем реальная длина записи, то возникает ошибка, если больше – то при записи файла используется больше дискового пространства, чем необходимо. Параметр Access позволяет задать права доступа к открываемому файлу.

      Таблица 2. Виды доступа при произвольном доступе.

      Ключевое словоОписание
      Без указания
      ExpandedWrap disabled
        Open "DATE.DAT" For Random As intFH
      Чтение (Read)
      ExpandedWrap disabled
        Open "DATE.DAT" For Random Access Read As intFH
      Запись (Write)
      ExpandedWrap disabled
        Open "DATE.DAT" For Random Access Write As intFH
      Чтение и запись (Read Write)
      ExpandedWrap disabled
        Open "DATE.DAT" For Random Access Read Write As intFH


      Если права доступа не указаны, то по умолчанию используется Read Write. Так как этот тип доступа обычно предназначен для работы с файлами, которые могут использоваться многими пользователями или приложениями, то следует обеспечить целостность данных при коллективном использовании. Для этого следует установить параметр Lock, определяющий права доступа к открытому файлу. Этот параметр может принимать следующие значения:

      * Shared Файл может использоваться всеми процессами для считывания и записи.
      * Lock Read Никакой другой процесс не может считывать данные из файла. Данный параметр можно установить, если в данный момент никакой другой процесс не выполняет операцию чтения.
      * Lock Write Никакой другой процесс не может записывать данные в файл. Данный параметр можно установить, если в данный момент никакой другой процесс не выполняет операцию записи.
      * Lock Read Write Никакой другой процесс не может считывать или записывать. Данный параметр можно установить, если в данный момент не выполняются операции чтения или записи.

      Параметр Len задает длину одной записи. Для задания длины можно использовать функцию Len:

      ExpandedWrap disabled
        Open "ADDRESS.DAT" For Random Access Write As 1 Len = 27
        Open "ADDRESS.DAT" For Random Access Write As 1 Len = Len(Varname)


      При этом важно, чтобы при открытии файла была известна длина набора данных, что может быть проблематичным, если происхождение файла неизвестно.

      Ввод и вывод

      Get, Put

      Для записи и чтения данных используются соответственно операторы Put и Get.

      ExpandedWrap disabled
        Put #FileHandle, RecNumber, Variable
        Get #FileHandle, RecNumber, Variable


      В примере в файл записываются данные из переменной Address, причем номер записи равен 7, а затем в переменную Address считывается вторая запись файла.

      ExpandedWrap disabled
        Put #intFH, 7, Address  'сохраняет 7-ую запись
        Get #intFH, 2, Address  'считывает 2-ую запись

      Для того чтобы в одной записи сохранить несколько значений различных типов, следует использовать пользовательские типы данных:

      ExpandedWrap disabled
        '(General)(Declaration)
         
        Type Person
        FirstName As String * 20
        Name As String * 20
        CustomerN As Integer
        End Type
         
        Private Customer As Person
        'Процедура
        Private Sub Command1_Click()
        intFH = FreeFile
        Open "C:\LORE.DAT" For Random As intFH Len = Len(Customer)
        Get #intFH, 2, Customer
        Close #intFH
        End Sub


      Двоичный доступ

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

      Open

      Для открытия двоичного файла также используется оператор Open.

      ExpandedWrap disabled
        Open FileName For Binary [Access] [Lock] As [#] FileHandle


      Вот и всё что я хотел сказать! :P
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0310 ]   [ 16 queries used ]   [ Generated: 18.04.24, 06:36 GMT ]