четверг, 19 ноября 2009 г.

Файловый поток

Сегодня я расскажу про работу с бинарными файлами в HiAsm. Надеюсь, вы прочитали статью про бинарные файлы и знаете, что они из себя представляют. Это очень понадобится для правильного понимания работы компонентов.

Все необходимые компоненты находятся на вкладке «Файлы», в группе «Потоки». Прежде всего это FileStream, который открывает файл. Давайте познакомимся с ним поближе.

У компонента FileStream есть два важнейших метода: doOpen – для открытия файла и doClose – для закрытия. Однако открытие здесь означает не открытие файла в соответствующей ему программе, а получение байт из файла, а точнее – файлового потока. Это специальный тип данных, который содержит в себе все байты файла.
К открытому таким образом файлу не могут получить доступ другие программы, его нельзя удалить. Вновь доступ к нему появляется лишь при закрытии методов doClose. Это следует всегда помнить.

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

Внимательно рассмотрите параметр компонента Mode. Он определяет, в каком режиме открывается файл: для чтения, для записи или для того и другого. ВНИМАНИЕ! Если вы открыли файл для записи (Mode=Write), то все данные из файла стираются без восстановления! Открывать в этом режиме можно лишь вновь созданные файлы (которые вы создавали специально для записи) либо абсолютно точно ненужные.


Однако потоковые данные не всегда нужны, иногда (и даже часто) важны лишь определённые байты файла. И для этого нужен компонент DataToFile. Он позволяет считывать байты из файлового потока и записывать их туда. Что у него есть? Два метода: doGet и doPut, о назначении которых нетрудно догадаться, точка данных для передачи компоненту файлового потока и событие с точкой свойства.

А ещё у него есть параметр Type, который определяет, сколько байтов за один вызов метода нужно записать/считать. Правда, там нужно указывать не число, а тип переменной, в которую запишутся байты (а точнее – числовые значения байт, которые вы сможете использовать по своему назначению).
Byte - 1 байт (256 значений)
Word - 1 слово = 2 байта (65 536 значений)
Cardinal, Integer - 4 байта (4 294 967 296 значений)
Real - 8 байт (18 446 744 073 709 551 616 значений)
PString - это строка Паскаля. Если выбрать её, то все прочитанные байты будут представлены как символы. Длину строки определяет первый её (служебный) байт, а поскольку байт не может быть больше 255, то и длина строка Паскаля - тоже.
AnsiString - это тоже строка, но её конец определяется байтом со значением 0 (когда он встретится, чтение байтов и перевод их в символы прекратится). Она может содержать гораздо больше символов.



Вот так мы считываем один первый байт из файла, выводя в поле ввода его числовое значение. Возникает вопрос: как добраться до остальных байт? Например, нужно прочитать 10-й байт, как быть?

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

Это как взгляд при чтении книги: при открытии мы смотрим на первое слово, после его прочтения – автоматически переходим ко второму. То же самое и при записи.

Принудительно передвинуть указатель в файловом потоке можно с помощью метода doPosition. Он есть у обоих компонентов. Есть также и свойство Position, которое показывает, где в данный момент находится указатель.



В этом примере происходит чтение 4-х байт (см. параметр Type) с 38-й позиции файла.

Это основные приёмы работы с бинарными файлами. Вот несколько интересных примеров.



Здесь после выбора файла запускается условный цикл, который генерирует событие, пока позиция указателя в файле меньше размера файла (размер в байтах). А так как при чтении указатель сдвигается на следующий байт, то чтение прекратится после прохождения указателя через все байты. Каждый из них конвертором (со вкладки «Инструменты») преобразуется в символ и выдаётся в новую строку многострочного поля ввода.
Загрузите так текстовый файл, но не большой (не больше килобайта), иначе придётся долго ждать, ведь таким способом текстовые файлы не читают, это просто пример.



А в этом примере из файла берётся с 11-й позиции 4 байта и устанавливается соответствующий их значению цвет формы. Правда, все оттенки обычно укладываются в 3 байта, то есть это 16 777 216 вариантов.

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




Компания "Трансмиссия" выполнит транспортные перевозки грузов по Екатеринбургу и России. Большой выбор транспорта для первозок.

А вот каталог, где вы найдёте туристические агентства Екатеринбурга. Большой выбор турфирм для поездок на отдых.

Если вы соберётесь съездить куда-нибудь, то вам стоит почитать отзывы туристов Туристер.ру. Там и отзывы о Китае, и об Арабии, и о Кубе.

4 комментария:

  1. Абалдеть!!! Я все не так делал. Ну просто ОГРОМНОЕ спасибо !Очень доходчиво объясняешь. С нетерпением жду другие уроки

    ОтветитьУдалить
  2. Не работают ссылки на примеры

    ОтветитьУдалить
  3. Ну вот наконец все работает как надо. файл могу просмотреть побайтно .

    ОтветитьУдалить