<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=329575&amp;view=findpost&amp;p=2867681</guid>
        <pubDate>Sat, 02 Apr 2011 17:25:20 +0000</pubDate>
        <title>Ввод и вывод информации. Файлы</title>
        <link>https://forum.sources.ru/index.php?showtopic=329575&amp;view=findpost&amp;p=2867681</link>
        <description><![CDATA[Diamock: Здравствуйте <strong class='tag-b'>Уважаемые&#33;</strong><br>
Очень много вопросов, по стандарным методам и свойствам VB, таким, как файловый ввод и вывод. Надоело :( .<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='14' style='font-size:14pt;'>Файлы</span></strong><br>
<br>
Итак, вы познакомились с некоторыми средствами ввода информации. Однако эту информацию зачастую требуется не только анализировать, но и сохранять. Для сохранения информации предназначены операторы обработки файлов, позволяющие считывать и сохранять данные на различных носителях (гибкий либо жесткий диск и т.п.). Процесс открытия и сохранения файлов состоит из нескольких этапов:<br>
<br>
* получение дескриптора файла (Handle);<br>
* открытие файла;<br>
* чтение или запись данных;<br>
* закрытие файла.<br>
<br>
<span class='tag-size' data-value='14' style='font-size:14pt;'><strong class='tag-b'>Дескриптор файла</strong></span><br>
<br>
Чтобы работать с файлами, нужно понимать, как связывается система или приложение с файлом. Для этого имеется канал ввода/вывода. При открытии файлу ставится в соответствие канал с определенным номером. Таким образом, каждый открытый файл имеет собственный канал, с помощью которого записываются или считываются данные. Следовательно, для ввода и вывода данных в файл имеет значение не имя файла, а номер канала. Кроме того, операционная система должна иметь сведения о наличии свободных каналов, которые можно использовать для открытия файла.<br>
<br>
<strong class='tag-b'>FreeFile</strong><br>
<br>
Функция Visual Basic <strong class='tag-b'>FreeFile</strong> возвращает номер свободного канала, который можно использовать для работы с файлом.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">FreeFile[(RangeNumber)]</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Если свободных каналов нет (открыто максимально допустимое количество файлов), возникает ошибка выполнения.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">intFH=FreeFile</div></ol></div></div></div></div><br>
В этом примере переменной intFH присваивается целое значение, которое можно использовать для открытия файла. Необязательный параметр <strong class='tag-b'>RangeNumber</strong> позволяет определить диапазон значений, из которого выбирается очередной свободный номер канала. Если его значение равно 0 (по умолчанию), то возвращается номер канала из диапазона 1 – 255, если 1, то из диапазона 256 – 511.<br>
<br>
<span class='tag-size' data-value='14' style='font-size:14pt;'><strong class='tag-b'>Типы доступа</strong></span><br>
<br>
В Visual Basic реализованы три типа доступа к файлам:<br>
<br>
* последовательный (Sequential) – для чтения и записи текстовых файлов;<br>
* произвольный (Random) – для чтения и записи текста или структурированных двоичных файлов с записями фиксированной длины;<br>
* двоичный (Binary) – для чтения и записи произвольно структурированных файлов.<br>
<br>
При создании коммуникационных каналов система должна знать, какой тип доступа к каждому конкретному файлу нужно использовать и какова структура данных этого файла.<br>
<br>
<strong class='tag-b'>Последовательный доступ</strong><br>
<br>
Последовательный доступ используется главным образом при работе с текстовыми файлами. Любая информация считывается или сохраняется в текстовом виде построчно. В тексте могут находиться символ перевода строки (<strong class='tag-b'>vbCrLf</strong> или <strong class='tag-b'>Chr (13)</strong> &amp; <strong class='tag-b'>Chr (10)</strong>) или табулятор (<strong class='tag-b'>Tab</strong> или <strong class='tag-b'>Chr (9)</strong>). Эти символы используются для форматирования текста.<br>
<br>
Способ открытия файла с последовательным доступом (для чтения, записи или добавления) задается при вызове оператора <strong class='tag-b'>Open</strong>:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Open FileName For [Input | Output | Append] As FileHandle</div></ol></div></div></div></div><br>
<strong class='tag-b'>Таблица 1.</strong> Различные операционные возможности для последовательного доступа.<br>
<br>
<table class='post_table tag-table'><tr><th>Ключевое слово</th><th>Описание</th></tr><tr><td><strong class='tag-b'>Input</strong></td><td>Открытие только для чтения из файла</td></tr><tr><td><strong class='tag-b'>Output</strong></td><td>Открытие для записи в файл</td></tr><tr><td><strong class='tag-b'>Append</strong></td><td>Открытие для добавления к файлу</td></tr></table><br>
<br>
Если файл не существует и открывается для чтения (<strong class='tag-b'>For input</strong>), то Visual Basic выдает сообщение об ошибке, а если для записи или добавления (<strong class='tag-b'>Output</strong> или <strong class='tag-b'>Append</strong>), то создается новый файл. Если файл с указанным именем существует, то в режиме <strong class='tag-b'>Output</strong> его содержимое удаляется, а в режиме <strong class='tag-b'>Append</strong> файл открывается для добавления:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Open &quot;C:\README.TXT&quot; For Input As intFH1</div><div class="code_line">Open &quot;C:\DATA\TEXT.TXT&quot; For Output As intFH2</div><div class="code_line">Open &quot;C:\USERS.TXT&quot; For Append As intFH3</div></ol></div></div></div></div><br>
<br>
В конце строки указывается номер канала, возвращаемый функцией <strong class='tag-b'>FreeFile</strong>. В некоторых операционных системах, например в Windows 95/98, можно использовать длинные имена файлов.<br>
<br>
<strong class='tag-b'>Чтение из файла</strong><br>
<br>
Для считывания данных из файла, открытого для последовательного доступа, существует несколько возможностей. В общем случае это осуществляется с помощью оператора <strong class='tag-b'>Input</strong>, имеющего несколько разновидностей:<br>
<br>
* <strong class='tag-b'>Line lnput#</strong> считывает одну строку;<br>
* <strong class='tag-b'>Input#</strong> считывает последовательность символов, обычно записанных с помощью оператора Write#;<br>
* <strong class='tag-b'>Input&#036;</strong> считывает определенное количество символов.<br>
<br>
Существует несколько вариантов чтения всей информации из файла. Перед чтением нужно открыть файл с помощью оператора <strong class='tag-b'>Open… For</strong>:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">intFH = FreeFile</div><div class="code_line">&nbsp;&nbsp;Open &quot;С:\Text.Txt&quot; For Input As #intFH </div><div class="code_line">&#39;Первый вариант</div><div class="code_line">&nbsp;&nbsp;Do Until EOF(intFH) </div><div class="code_line">&nbsp;&nbsp; &nbsp;Line Input #intFH, strString </div><div class="code_line">&nbsp;&nbsp; &nbsp;strText = strText &amp; strString &amp; vbLf</div><div class="code_line">&nbsp;&nbsp;Loop</div><div class="code_line">&nbsp;</div><div class="code_line">&#39;Второй вариант</div><div class="code_line">&nbsp;StrText = Input$(LOF(intFH), intFH)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;Close #intFH</div></ol></div></div></div></div><br>
<br>
Оба варианта приводят к одинаковому результату.<br>
<br>
В первом варианте оператор <strong class='tag-b'>Input</strong> выполняется в цикле, пока не будет, достигнут конец файла. Функция <strong class='tag-b'>EOF</strong> (<strong class='tag-b'>End Of File</strong>) возвращает значение <strong class='tag-b'>True</strong> при достижении конца файла. При этом на каждом шаге цикла считывается отдельная строка и к ней добавляется символ конца строки, который отбрасывается оператором <strong class='tag-b'>Line Input</strong>.<br>
<br>
Во втором варианте весь файл считывается функцией <strong class='tag-b'>Input&#036;</strong>. Функция <strong class='tag-b'>LOF</strong> (<strong class='tag-b'>Length Of File</strong>) позволяет определить длину файла в байтах.<br>
<br>
Заметим также, что независимо от вида оператора <strong class='tag-b'>Input</strong> указывается не <strong class='tag-b'>FileName</strong> (имя файла), а только номер канала, т.е. дескриптор файла (<strong class='tag-b'>intFH</strong>).<br>
<br>
<strong class='tag-b'>Close</strong><br>
<br>
Оператор <strong class='tag-b'>Close</strong> предназначен для закрытия открытого файла или канала.<br>
<br>
<strong class='tag-b'>Запись в файл</strong><br>
<br>
В Visual Basic для записи информации в файл используются операторы <strong class='tag-b'>Print#</strong> и <strong class='tag-b'>Write#</strong>.<br>
<br>
<strong class='tag-b'>Print#</strong><br>
<br>
Оператор <strong class='tag-b'>Print#</strong> функционирует почти так же, как его <em class='tag-i'>коллега</em> для экрана, с той лишь разницей, что данные не выводятся на экран, а сохраняются в файле, открытом для записи или добавления (<strong class='tag-b'>Open… For Output</strong> или <strong class='tag-b'>Open… For Append</strong>).<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Print #FileHandle, [(Spase(n)| Tab[(n)]] [Expression] [Charpos]</div></ol></div></div></div></div><br>
<br>
Синтаксис оператора на первый взгляд выглядит сложно:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Print #intFH, Text1.Text</div><div class="code_line">Print #intFH, &quot;Фрагмент 1&quot;, &quot;Фрагмент 2&quot;</div><div class="code_line">Print #intFH, &quot;Это составляет &quot;; &quot;единое целое&quot;</div></ol></div></div></div></div><br>
<br>
Для форматирования записываемой в файл информации следует по-разному разделять данные в операторе <strong class='tag-b'>Print</strong>. Если в операторе данные разделять запятыми <strong class='tag-b'>[,]</strong>, то в файле они будут разделены символами табуляции:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Print #intFH, &quot;Фрагмент 1&quot;, &quot;Фрагмент 2&quot;</div><div class="code_line">&#39;соответствует</div><div class="code_line">Print #intFH, &quot;Фрагмент 1&quot;; Tab; &quot;Фрагмент 2&quot;</div></ol></div></div></div></div><br>
<br>
Если же в операторе для разделения данных использовать точку с запятой [;], то данные в файл записываются без разделителей:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Print #intFH, &quot;Это составляет &quot;; &quot;единое целое&quot;</div><div class="code_line">&#39;соответствует</div><div class="code_line">Print #intFH, &quot;Это составляет единое целое&quot;</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>Write#</strong><br>
<br>
Оператор <strong class='tag-b'>Write#</strong> имеет такой же синтаксис, что и <strong class='tag-b'>Print#</strong>. Отличие состоит только в форматировании вывода. Если <strong class='tag-b'>Print#</strong> сохраняет данные в виде обычного текста, то <strong class='tag-b'>Write#</strong> заключает текстовые строки в кавычки, а цифры выводятся без кавычек:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Print #intFH, &quot;Анна&quot;, &quot;Киев&quot;, 17</div><div class="code_line">&#39;В файле будет: Анна Киев 17</div><div class="code_line">Write #intFH, &quot;Анна&quot;, &quot;Киев&quot;, 17</div><div class="code_line">&#39;В файле будет: &quot;Анна&quot;,&quot;Киев&quot;,17</div></ol></div></div></div></div><br>
<br>
Данные, сохраненные с помощью оператора <strong class='tag-b'>Write#</strong>, можно считать оператором <strong class='tag-b'>Input#</strong>.<br>
<br>
<strong class='tag-b'>Произвольный доступ</strong><br>
<br>
Доступ типа <strong class='tag-b'>Random Access</strong> несколько утратил свое значение после появления в версии Visual Basic 3.0 средств доступа к базам данным. В отличие от последовательного доступа, при котором данные в файлах хранятся в неструктурированном виде, произвольный доступ предполагает, что файл имеет постоянную структуру. Это позволяет считывать данные в произвольном порядке.<br>
<br>
Произвольный доступ реализуется посредством оператора <strong class='tag-b'>Open</strong>.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Open FileName For Random [Access] [Lock] As [#]FileHandle [Len=RecLength]</div></ol></div></div></div></div><br>
<br>
Параметр <strong class='tag-b'>Len</strong> определяет длину записи. Если это значение меньше, чем реальная длина записи, то возникает ошибка, если больше – то при записи файла используется больше дискового пространства, чем необходимо. Параметр Access позволяет задать права доступа к открываемому файлу.<br>
<br>
<strong class='tag-b'>Таблица 2.</strong> Виды доступа при произвольном доступе.<br>
	<br>
<table class='post_table tag-table'><tr><th>Ключевое слово</th><th>Описание</th></tr><tr><td><strong class='tag-b'>Без указания</strong></td><td><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Open &quot;DATE.DAT&quot; For Random As intFH</div></ol></div></div></div></div></td></tr><tr><td><strong class='tag-b'>Чтение (Read)</strong></td><td><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Open &quot;DATE.DAT&quot; For Random Access Read As intFH</div></ol></div></div></div></div></td></tr><tr><td><strong class='tag-b'>Запись (Write)</strong></td><td><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Open &quot;DATE.DAT&quot; For Random Access Write As intFH</div></ol></div></div></div></div></td></tr><tr><td><strong class='tag-b'>Чтение и запись (Read Write)</strong></td><td><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Open &quot;DATE.DAT&quot; For Random Access Read Write As intFH</div></ol></div></div></div></div></td></tr></table><br>
<br>
Если права доступа не указаны, то по умолчанию используется <strong class='tag-b'>Read Write</strong>. Так как этот тип доступа обычно предназначен для работы с файлами, которые могут использоваться многими пользователями или приложениями, то следует обеспечить целостность данных при коллективном использовании. Для этого следует установить параметр <strong class='tag-b'>Lock</strong>, определяющий права доступа к открытому файлу. Этот параметр может принимать следующие значения:<br>
<br>
* <strong class='tag-b'>Shared</strong> Файл может использоваться всеми процессами для считывания и записи.<br>
* <strong class='tag-b'>Lock Read</strong> Никакой другой процесс не может считывать данные из файла. Данный параметр можно установить, если в данный момент никакой другой процесс не выполняет операцию чтения.<br>
* <strong class='tag-b'>Lock Write</strong> Никакой другой процесс не может записывать данные в файл. Данный параметр можно установить, если в данный момент никакой другой процесс не выполняет операцию записи.<br>
* <strong class='tag-b'>Lock Read Write</strong> Никакой другой процесс не может считывать или записывать. Данный параметр можно установить, если в данный момент не выполняются операции чтения или записи.<br>
<br>
Параметр <strong class='tag-b'>Len</strong> задает длину одной записи. Для задания длины можно использовать функцию <strong class='tag-b'>Len</strong>:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Open &quot;ADDRESS.DAT&quot; For Random Access Write As 1 Len = 27</div><div class="code_line">Open &quot;ADDRESS.DAT&quot; For Random Access Write As 1 Len = Len(Varname)</div></ol></div></div></div></div><br>
<br>
При этом важно, чтобы при открытии файла была известна длина набора данных, что может быть проблематичным, если происхождение файла неизвестно.<br>
<br>
<span class='tag-size' data-value='14' style='font-size:14pt;'><strong class='tag-b'>Ввод и вывод</strong></span><br>
<br>
<strong class='tag-b'>Get, Put</strong><br>
<br>
Для записи и чтения данных используются соответственно операторы <strong class='tag-b'>Put</strong> и <strong class='tag-b'>Get</strong>.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Put #FileHandle, RecNumber, Variable</div><div class="code_line">Get #FileHandle, RecNumber, Variable</div></ol></div></div></div></div><br>
<br>
В примере в файл записываются данные из переменной <strong class='tag-b'>Address</strong>, причем номер записи равен <strong class='tag-b'>7</strong>, а затем в переменную <strong class='tag-b'>Address</strong> считывается вторая запись файла.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Put #intFH, 7, Address &nbsp;&#39;сохраняет 7-ую запись</div><div class="code_line">Get #intFH, 2, Address &nbsp;&#39;считывает 2-ую запись</div></ol></div></div></div></div><br>
Для того чтобы в одной записи сохранить несколько значений различных типов, следует использовать пользовательские типы данных:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#39;(General)(Declaration)</div><div class="code_line">&nbsp;</div><div class="code_line">Type Person</div><div class="code_line">FirstName As String * 20 </div><div class="code_line">Name As String * 20 </div><div class="code_line">CustomerN As Integer</div><div class="code_line">End Type</div><div class="code_line">&nbsp;</div><div class="code_line">Private Customer As Person</div><div class="code_line">&#39;Процедура</div><div class="code_line">Private Sub Command1_Click()</div><div class="code_line">intFH = FreeFile</div><div class="code_line">Open &quot;C:\LORE.DAT&quot; For Random As intFH Len = Len(Customer)</div><div class="code_line">Get #intFH, 2, Customer </div><div class="code_line">Close #intFH</div><div class="code_line">End Sub</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>Двоичный доступ</strong><br>
<br>
Двоичный доступ незначительно отличается от произвольного доступа. Разница состоит только в том, что двоичный доступ возможен не к определенному набору данных, а к отдельному байту внутри любого файла.<br>
<br>
<strong class='tag-b'>Open</strong><br>
<br>
Для открытия двоичного файла также используется оператор <strong class='tag-b'>Open</strong>.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Open FileName For Binary [Access] [Lock] As [#] FileHandle</div></ol></div></div></div></div><br>
<hr>Вот и всё что я хотел сказать&#33; :P]]></description>
        <author>Diamock</author>
        <category>Работа с файлами&#092;папками</category>
      </item>
	
      </channel>
      </rss>
	