Объект romfile.

Значок объекта romfile.

Объект romfile. даёт доступ к файлам ресурсов вашего проекта (файлы ресурсов отображаются в ветке «Resource Files» дерева проекта).

Компилятор файлы ресурсов никак не обрабатывает - они просто добавляются в скомпилированный бинарный файл.

Файлы ресурсов предназначены для хранения постоянных данных, которые никогда не меняются (отсюда «rom» в «romfile» - от «Read-Only Memory», постоянной памяти).

Открытие файлов ресурсов

Файл ресурсов открывается вызовом метода romfile.open. В каждый момент времени может быть открыт только один файл ресурсов. Закрывать файлы ресурсов не нужно.

Размер открытого файла можно узнать через свойство romfile.size (только чтение).

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

romfile.open("loremipsum.txt")
if romfile.size=0 then
   sys.halt 'this resource file does not exist
end if
romfile.open("loremipsum.txt");
if(romfile.size==0)
   sys.halt(); //this resource file does not exist

Указатель файла

Текущая позиция в файле ресурсов задаётся указателем файла.

При открытии или повторном открытии файла ресурсов указатель устанавливается в 1 (первая позиция в файле); если же файл не существует или пуст, указатель равен 0.

Значение указателя не может превышать romfile.size + 1 (если только файл не существует или пуст - тогда единственное возможное значение указателя равно 0).

Позицию указателя можно прочитать и задать напрямую с помощью свойства romfile.pointer32.

Примечание

Есть и второе свойство - romfile.pointer. Оно 16-битное, поэтому для файлов больше 64 КБ работает неправильно. Свойство оставлено для совместимости со старыми приложениями - в новых проектах его не используйте.

Чтение из файлов ресурсов

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

В следующем примере показан цикл, который завершается, когда в файле больше нечего читать:

'read out the entire contents of a resource file
dim s as string
romfile.open("loremipsum.txt")
s=romfile.getdata(255)
while s<>""
   s=romfile.getdata(255)
wend
//read out the entire contents of a resource file
string s;
romfile.open("loremipsum.txt");
s=romfile.getdata(255);
while(s!="")
   s=romfile.getdata(255);

По мере чтения указатель перемещается - каждый раз на число прочитанных байтов.

Вот ещё один цикл чтения файла, на этот раз основанный на значении указателя:

dim s as string
romfile.open("loremipsum.txt")
do
   s=romfile.getdata(255)
loop while romfile.pointer32<=romfile.size
string s;
romfile.open("loremipsum.txt");
do{
   s=romfile.getdata(255);
}while(romfile.pointer32<=romfile.size);

Поиск в файлах ресурсов

Одно из основных применений файлов ресурсов - хранение данных конфигурации. Например, библиотека STG (настройки) от Tibbo опирается на файл ресурсов, который описывает доступные настройки, их типы, минимальные и максимальные значения и так далее.

Для эффективной работы с файлами конфигурации нужен быстрый поиск, и метод romfile.find32 реализует именно его.

Скорость поиска этого метода намного выше всего, чего можно добиться функцией поиска, написанной на Tibbo BASIC или C.

Кроме того, romfile.find32 позволяет указать начальную позицию поиска и номер интересующего вхождения.

Примечание

Есть и второе свойство - romfile.find. Оно 16-битное, поэтому для файлов больше 64 КБ работает неправильно. Свойство оставлено для совместимости со старыми приложениями. В новых проектах его не используйте.

Для примера предположим, что есть файл конфигурации с параметрами:

...
IP=192.168.1.40
PORT=1001
...

Вот код, который найдёт значение параметра IP:

const IP_STR="IP="
dim s as string
dim pos,pos2 as dword
romfile.open("text.txt")
pos=romfile.find32(1,IP_STR,1)
pos=pos+len(IP_STR)
romfile.pointer32=pos
pos2=romfile.find32(pos,chr(13),1) 'searching for the CR (line end)
s=romfile.getdata(pos2-pos)
'at this point s will contain "192.168.1.40"
#define IP_STR "IP="
string s;
unsigned long pos,pos2;
romfile.open("text.txt");
pos=romfile.find32(1,IP_STR,1);
pos+=len(IP_STR);
romfile.pointer32=pos;
pos2=romfile.find32(pos,chr(13),1);
s=romfile.getdata(pos2-pos);
//at this point s will contain "192.168.1.40"

Смещение файла

Иногда файл ресурсов нужно «передать» другому объекту. Для этого служит свойство romfile.offset (только чтение). Примеры использования см. в описании lcd.setfont и wln.boot.

Исходный материал Tibbo обновлён 22 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке