Достаточно часто возникает необходимость работать с так называемыми 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