LINUX.ORG.RU

чтение файлов конфигурации

 ,


1

1

Здравствуйте. Я только начинаю кодить на линукса на C++. У меня есть конфиг файл, по типу:

#this is comment
folder=/mnt/data
login=hello
password=world

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

Поэтому собственно вопрос: существует ли стандартный простой метод для парса стандартных простых конфигов?

Заранее спасибо

★★★

Есть Qt, есть Boost - можно их заюзать.

panter_dsd ★★★★
()

а в гугле я нашел только libconfig который, по моему мнению, является супероверкилом.

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

AF ★★★
()

конечно существует: fopen, fgets, malloc, strchr, strcpy

crowbar
()

Берёшь любой проект на c++, с похожими конфигами, и смотришь чем их читают. Профит.

anonymous
()

C++ Qt -> QSettings ini format - самое удобное решение.

MikeDM ★★★★★
()

boost::program_options::parse_config_file()

DELIRIUM ☆☆☆☆☆
()

либо либа-оверкил либо вело аля getpairs(filteroutcoments(input));

иначе море либ-андеркил и вопияния а кака либа лучше в моёй случае

qulinxao ★★☆
()

у тебя нет конфиг-файла.

у тебя есть персистентное хранилище json

qulinxao ★★☆
()

Ну у тебя есть 2.5 варианта:

1) Пердолиться со своим парсером, переизобретая json/ini/whatever (заодно опыт получишь! :D )

1.5) Пойти по простому пути и сказать, что вот у меня на первой строчке всегда путь к директории, на второй логин, а на третьей пароль и от этого плясать. Кто отвечает за валидность конфига в таком случае - хороший вопрос

2) Взять что-то готовое.

Midael ★★★★★
()
Последнее исправление: Midael (всего исправлений: 2)

Коли, ты только начинаешь кодить, то лучше написать самому. Набросать парсер подобных конфигов - дело пары часов с отладкой.

Есть еще такая штука как libconfig, но я бы выбрал libjsoncpp

Dikar ★★
()

Такой парсер пишется за пол часа на коленке. Но лучше взять готовое решение и не парить себе мозг.

andreyu ★★★★★
()

libconfig который, по моему мнению, является супероверкилом

Супероверкилл - это прикрутить tcl или lua для конфигов.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

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

А, ну и да - либа на чистом C

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)

Можно конфиг в sqlite базе держать

Harald ★★★★★
()

В c++ написал однажды свой велосипед за пару часов, пользуюсь по сей день. Пробовал libconfig но там мне что-то не понравилось. Кажется, это была невозможность объявлять одинаковые [секции] или ещё что-то тривиальное.

jeuta ★★★★
()

Я сильно сомневаюсь, что каждый из разработчиков пишет свой костыль по парсу таких конфигов

Что значит «пишет костыль»? Это реализуется в единицы строк кода наже на сишечке - прочитать строку, проверить первый символ на #, найти = -> всё, получили key/value.

slovazap ★★★★★
()

Идеологически кошерный способ передачи конфига в Unix - через environment variables. Конфиг в таком случае - скрипт, устанавливающий значения переменных и запускающий твой бинарник.

anonymous
()
Ответ на: комментарий от qulinxao

Да, нужно сперва сделать trim строки.

anonymous
()
Ответ на: комментарий от qulinxao

Элементарно же, Ватсон! ;)

#include <ctype.h>
#include <stdio.h>
#include <string.h>

/* recognized keys */
enum { Folder, Login, Password, nKeys };
char *keys[nKeys] = {
	[Folder]   = "folder",
	[Login]    = "login",
	[Password] = "password",
};

/* configuration */
char *config[nKeys];

char *
trim(char *s)
{
	char *p = s + strlen(s) - 1;

	/* trim at head */
	while (isascii(*s) && isspace(*s))
		s++;

	/* trim at tail */
	while (isascii(*p) && isspace(*p))
		*p-- = '\0';
	
	return s;
}

void
rdconf(FILE *fd)
{
	char buf[81], *s, *p;
	char *key, *value;
	int i;

	while (fgets(buf, sizeof(buf), fd) != NULL) {
		s = trim(buf);

		/* got comment or empty line? go ahead */
		if (*s == '#' || *s == '\0')
			continue;

		/* not a key=value pair? go ahead */
		p = strchr(s, '=');
		if (!p)
			continue;

		/* separate key and value */
		*p++ = '\0';

		/* trim again in case there was a whitespace around '=' */
		key = trim(s);
		value = trim(p);

		/* and store it finally */
		for (i = 0; i < nKeys; i++)
			if (strcmp(keys[i], key) == 0)
				config[i] = strdup(value);
	}
}

int
main()
{
	rdconf(stdin);

	printf("folder:   %s\n", config[Folder]);
	printf("login:    %s\n", config[Login]);
	printf("password: %s\n", config[Password]);

	return 0;
}

Зачем тут лишняя библиотека — мне не совсем ясно.

beastie ★★★★★
()
Ответ на: комментарий от stevejobs

лицензию на код не написал. Теперь его нельзя отсюда копипастить, только смотреть

Наркоманы в треде!

Valkeru ★★★★
()

REGEX(3) Linux Programmer's Manual REGEX(3)

NAME regcomp, regexec, regerror, regfree - POSIX regex functions

SYNOPSIS #include <sys/types.h> #include <regex.h>

int regcomp(regex_t *preg, const char *regex, int cflags);

int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);

size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);

void regfree(regex_t *preg);

emulek
()
Ответ на: комментарий от stevejobs

а лицензию на код не написал. Теперь его нельзя отсюда копипастить, только смотреть :( Технопорево

мдеее

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.