Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удобных конфиг 
:(
    Опции темы
Тигер
Дата 23.10.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



Как на С++ огранизовать удобный оффлайн конфиг. тобишь ini и пр. рантайм не предлогать =)
хочется что-то вроде

cnfMap["file_name"]="My file";
cnfMap["count"]=5;
cnfMap["zlo"]=0.0006;

структуры и union не подходят. точнее не совсем подходят. нужен именно маппер с ключами, что бы можно было вывести конфиг в цикле как
key => value
PM MAIL   Вверх
boostcoder
Дата 23.10.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



конечно же boost.property_tree.
PM WWW   Вверх
Тигер
Дата 23.10.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



спасибо, это идеальное решение.
но у меня программа не большая, там поминимому библиотек, тоесть хотелось бы вариант максимум с STL, WinAPI
PM MAIL   Вверх
boostcoder
Дата 23.10.2010, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



изврат конечно, но сам когда-то писал.
Код


#ifndef CONFIGFILE_HPP
#define CONFIGFILE_HPP

#include <string>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <stdexcept>

/***************************************************************************/

class config_file {
public:
    class variant {
        public:
            variant(const std::string& s):str(s) {}
            ~variant() {}
            /**  */
         template<typename T>
            T as() const {
                T result;
                std::stringstream ss(str);
                ss >> result;
                return result;
            }
         operator std::string () const { return str; }
        private:
            variant();
            std::string str;
    };
    /**  */
   config_file(const std::string& fn):fname(fn) {
      std::ifstream file(fname);
      if ( !file ) {
         throw std::runtime_error("config file not exists!");
      }
   }
    /**  */
    variant operator[] (const std::string& key) const {
        std::string temp, result;
        std::ifstream file(fname.c_str());
        if ( !file ) {
            throw std::invalid_argument("can`t open config file!");
        }
        while ( !file.eof() ) {
            std::getline(file, temp);
            if ( !temp.size() || temp[0] == '#' ) continue;
            if ( std::find(temp.begin(), temp.end(), '\r') != temp.end() ) {
                temp.erase(std::remove(temp.begin(), temp.end(), '\r'), temp.end());
            }
            if ( parse_string(result, key, temp) ) {
                break;
            }
        }
        if ( result.empty() ) {
            throw std::invalid_argument("value of string is empty for: " + key);
        }
        return result;
    }
private:
    bool parse_string(std::string& path, const std::string& key, const std::string& str) const {
        std::string::const_iterator it = std::search(str.begin(), str.end(), key.begin(), key.end());
        if ( it == str.end() ) return false;

        std::advance(it, key.length());

        while ( *it++ != '=' ) {}
        while ( *++it == ' ' ) {}
        path.assign(it, str.end());
 
       return true;
    }

private:
    std::string fname;
};

/***************************************************************************/

#endif /** CONFIGFILE_HPP */



Это сообщение отредактировал(а) boostcoder - 23.10.2010, 17:03
PM WWW   Вверх
Тигер
Дата 23.10.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



идея интересная, но что-то я не пойму почему у меня не работает

map<string,variant*> cnf;
cnf["test"]=new variant("5");
int num=cnf["test"]->as<int>();

и даже так

variant is("5");
int num=is.as<int>();
PM MAIL   Вверх
boostcoder
Дата 23.10.2010, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



что-то вы нагородили..

так:
Код

config_file config("file.conf");
...
int i = config["key1"].as<int>();
std::string s = config["key2"].as<std::string>();

PM WWW   Вверх
Леопольд
Дата 23.10.2010, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Тигер @  23.10.2010,  19:20 Найти цитируемый пост)
и даже так
сделай как-то так:
config.h
Код
map<string,int> cnf;

config.cpp
Код
namespace
{
    class InitConfig{
        InitConfig() 
        {
            cnf["test"]=5;
        }
    } initConfig;
}


правда смысла от этого не вижу, лучше констант наплодить...

Это сообщение отредактировал(а) Леопольд - 23.10.2010, 19:44


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Тигер
Дата 23.10.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



ну мне файл просто не нужен.  тоесть мне каг бы нужeн оффлайн глобальный массив конфигурации

чтобы я сделал так
Код

map<...> cnf;
cnf[...]=...;
/* а потом */
some function(){ cnf["some"]->as<int>(); }
/* и тд */

тобишь просто массив с "разными типами" структуры и объединения не подходят
из-за неудобной иницаилизации в случае с контейнером map
из-за невозможности вывести  содержимое как key => value; в случае простой конфигурационной структуры без map =)

Это сообщение отредактировал(а) Тигер - 23.10.2010, 19:39
PM MAIL   Вверх
Леопольд
Дата 23.10.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Тигер @  23.10.2010,  19:38 Найти цитируемый пост)
ну мне файл просто не нужен.  тоесть мне каг бы нужeн оффлайн глобальный массив конфигурации
Это называется хардкод, когда что-то вшивается в исполняемый файл.



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Тигер
Дата 23.10.2010, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



пусть так, главное что рантайм не подходит.
PM MAIL   Вверх
Леопольд
Дата 23.10.2010, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Тигер @  23.10.2010,  19:45 Найти цитируемый пост)
пусть так, главное что рантайм не подходит
И то и другое рантайм.
Лучше вынести константы в отдельный namespace:
Код
namespace Cfg
{
    char const* key1 = "key1";
    int const key2 = 5;
    //...
}



Это сообщение отредактировал(а) Леопольд - 23.10.2010, 19:53


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 23.10.2010, 19:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



в извращениях не участвую smile 
PM WWW   Вверх
Тигер
Дата 23.10.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



Леопольд
namespace нельзя вывести как key=>value в цикле =)
boostcoder
это называется удобный конфиг,а не извращение ;)
PM MAIL   Вверх
Леопольд
Дата 23.10.2010, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Тигер @  23.10.2010,  19:56 Найти цитируемый пост)
называется удобный конфиг
Это точно не конфиг, его нельзя изменить, а конфиг подразумевает настройку bез перекомпиляции.


Это сообщение отредактировал(а) Леопольд - 23.10.2010, 19:58


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Тигер
Дата 23.10.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



можно - при компиляции
Цитата

а конфиг подразумевает настройку bез перекомпиляции.

нет

Это сообщение отредактировал(а) Тигер - 23.10.2010, 20:00
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1100 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.