# Это коментарий
[general]
param1 = test
param2 = 10
парсер конфига
Мне надо простой конфиг пропарсить, буквально логин-пас для базы и еще пару опций.
Аргументы коммандной строки не подойдут, именно конфигурационный файл нужен.
Структура проста - в конфиге есть секции, в секциях есть файлы. В общем-то все как в ini файле в винде.
Комментарии - символ решетка в начале строки.
Пример
Код:
Значения параметров можно получить как в виде строки, так и в виде числа.
Исходники реализации во вложении к сообщению, если будет необходим пример - напишу позже.
Спасибо! Попробую разобраться
а можно примерчик как этим пользоваться?
config.c:7:17: error: log.h: No such file or directory
_____
Это решил, заменил log на printf
Код:
config_context_t* cfg_cnx;
char* param1;
int param2;
cfg_cnx = config_open("myconfig.cfg");
if(!cfg_cnx)
{
fprintf(stderr, "Failed to load config.\n");
return 1;
}
param1 = config_get_string(cfg_cnx, "general", "param1");
param2 = config_get_int(cfg_cnx, "general", "param2");
printf("param1: %s, param2: %d\n", param1, param2);
config_close(cfg_cnx);
char* param1;
int param2;
cfg_cnx = config_open("myconfig.cfg");
if(!cfg_cnx)
{
fprintf(stderr, "Failed to load config.\n");
return 1;
}
param1 = config_get_string(cfg_cnx, "general", "param1");
param2 = config_get_int(cfg_cnx, "general", "param2");
printf("param1: %s, param2: %d\n", param1, param2);
config_close(cfg_cnx);
Следует быть внимательным в случае строковых параметров: значения параметров сохраняются в динамической памяти, а функция config_get_string возвращает этот адрес. Т.е. после вызова config_close() все строковые параметры будут недействительны.
Также там в коде используется функция log() - в том проекте у меня была своя система логгирования. В самом простом случае можно написать так:
Код:
#define log printf
Цитата: metallic
Есть готовая библиотека?
Мне надо простой конфиг пропарсить, буквально логин-пас для базы и еще пару опций.
Аргументы коммандной строки не подойдут, именно конфигурационный файл нужен.
Мне надо простой конфиг пропарсить, буквально логин-пас для базы и еще пару опций.
Аргументы коммандной строки не подойдут, именно конфигурационный файл нужен.
libcfg
http://platon.sk/projects/proj_doc_page.php?project_id=3
В принципе из исходников понял, что мне нужно всего несколько ф-ий, типа
config_get_string, config_get_int ну и открытия файла? остальные можно удалить?
И еще, не понял про config_close, т.е. пока программа работает и ей нужен конфиг делать config_close не надо, а то значения прочитанные из конфига уничтожаться?
Цитата: metallic
В принципе из исходников понял, что мне нужно всего несколько ф-ий, типа
config_get_string, config_get_int ну и открытия файла? остальные можно удалить?
Да. Этого вам будет будет достаточно и больше там ничего и нет.
А какие там остальные функции? Они же друг друга вызывают. Думаю ничего удалить оттуда не получится. Кроме разве что config_get_double.
Цитата: metallic
И еще, не понял про config_close, т.е. пока программа работает и ей нужен конфиг делать config_close не надо, а то значения прочитанные из конфига уничтожаться?
Ну можно скопировать все строки в отдельные буфера, а потом закрыть конфиг. Тогда и числа и строки остануться (числа копировать не надо). Т.е. примерно так:
Код:
#define BUF_SIZE 32
/* ... */
char param1[BUF_SIZE], *ptr;
/* ... */
cfg_cnx = config_open("myconfig.cfg");
ptr = config_get_string(cfg_cnx, "general", "param1");
strncpy(param1, ptr, BUF_SIZE);
config_close(cfg_cnx);
/* значение, хранящееся в param1, здесь можно использовать */
/* ... */
char param1[BUF_SIZE], *ptr;
/* ... */
cfg_cnx = config_open("myconfig.cfg");
ptr = config_get_string(cfg_cnx, "general", "param1");
strncpy(param1, ptr, BUF_SIZE);
config_close(cfg_cnx);
/* значение, хранящееся в param1, здесь можно использовать */
Ясно. Спасибо, все что нужно, ничего лишнего и все просто.