LEM: C++ библиотека поисковой машины - парсер ini-файлов

Достаточно часто возникает необходимость работать с так называемыми ini-файлами. В ОС Windows такие файлы используются достаточно редко, а в Linux - очень часто. В этих файлах разработчики программ собирают различные установочные параметры, которые с одной стороны меняются достаточно редко, а с другой стороны забивать из в код программы неразумно.

Обычно встречается такой формат:

[Section-1]

param1 = 1.2345

param2 = "dfg"

param3 = true

[Section-2]

param4 = 2

То есть параметры собираются в именованные секции.

Для работы с такими файлами созданы два класса Ini_Parser и Xml_Parser. в пространстве имен lem::Cfg_Parser.

Они объявлены в cfg_parser.h.

Для открытия файла вызывается метод Open, которому передается указатель на поток - объект-потомок класса BaseStream. Непосредственно в конструкторе происходит полный парсинг файла, строится дерево параметров. Для разбивки текстового файла на лексемы используется лексер Base_Parser.

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

[Section-1]

{

 param1 = 1.2345

 [Section-2]

  param4 = 2

}

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

Дерево секций и параметров состоит из объектов SectionTree. Получить доступ к дереву можно в производных от Base_ProFile классах. Получив ссылку на построенное дерево с помощью метода Base_ProFile::GetTree(), можно свободно перемещаться по дереву с помощью методов Prev(), Next(), Up(), Down() класса SectionTree.

После загрузки дерева программа может:

1. Перемещаться по дереву секций и параметров, устанавливая текущую секцию. Для этого используется метод ::seek_section(), которому передается путь к секции. Если метод вернул false, то произошла ошибка позиционирования на секции (обычно это означает, что такой секции просто нет).

Если вложенных секций нет, то путь к секции совпадает с ее именем.

Если есть вложенные секции, то путь к секции включает в себя имена родительских секций, разделенные символом обратного слэша \. Путь можеть быть относительным - в этом случае перемещение начинается от текущей секции. Относительный путь имеет вид

.\Section-1\Section2

То есть точка обозначает текущую секцию. Две точки означают корневую для текущей секцию:

..\Section2

Двоеточие - корень всего дерева:

:\Section1

В общем, пути к секциям очень похожи на файловые пути.

2. Считывать параметры из текущей секции или из произвольных.

Для этого используются методы get_int, get_bool, get_string, get_real. Они получают путь к секции (пустая строка означает текущую секцию), имя параметра и значение по умолчанию, которое возвращается, если параметр не найден.

После перемещения на секцию методом seek_section(), можно перебрать все параметры в этой секции (пропуская вложенные) с помощью метода GetNextVar().

3. Изменять значение параметров. Новое значение сразу записывается в исходный ini-файл. Используется метод write_to_config(), которому указывается имя секции, имя параметра и значение параметра (строки). Если указанной секции нет, то она будет создана. Аналогично для параметра: если такого параметра в секции нет, то он будет вписан, иначе - будет изменено его значение.

  © Mental Computing 2010