Jak stworzyć startowy plik konfiguracyjny?

0

Cześć,
pisze prosty program, który przedstawia przykład z teorii automatów komórkowych. Przed uruchomieniem chciałbym, aby mój soft pobierał jakieś informacje startowe, które wcześniej zostały zapisane w trakcie działania oraz zwykłe informacje z pliku konfiguracyjnego. Pytanie brzmi w jaki sposób mógłbym ten problem rozwiązać? boost::property_tree albo boost::Program_options to to czego potrzebuje czy może dotyczy to czegoś innego?
Do tej pory tego typu kwestie rozwiązywałem poprzez zwykłe zapisanie do pliku.

1

Zależy jakie dane chcesz zapisać.
Ustawienia paragramu w boost::property_tree jest bardzo poręcznym rozwiązaniem, dane tam zawarte można zapisać w pliku ini.
boost::property_tree::ini_parser::write_ini jest proste i przyjemne w użyciu.

Pamiętaj jednak, że w zależności od systemu, lokalizacja pliku ini jest inna i dobrą praktyką jest doczytać, gdzie system zaleca zapisywać takie dane.

0

Zależy jakie dane chcesz zapisać.

Głównie będą to wymiary planszy, początkowe ustawienie figur lub z poprzedniego uruchomienia programu.

1

To są małe lekkie dane, więc plik ini jest wręcz wskazany.

0

A jak rozwiązać ten problem pierwszego uruchomienia programu? Mam ręcznie wypełnić plik ini z jakimiś danymi? Czy może istnieje funkcja w boost::property_tree która sprawdza czy plik nie jest pusty?

1

Są dwie metody

  1. podczas instalacji instalowany jest też plik ini z domyślnymi ustawieniami.
  2. odczytując wartości z boost::property_tree można dostarczyć wartość domyślną.
auto nodeSentence = node->get_value_optional<std::string>().get_value_or("ala ma kota");
auto ptreeOptionSentence = ptree->get_value_optional<std::string>("sekcja.opcja").get_value_or("ala ma kota");
0

Dzięki, mam taki kod do czytania z ini:

void Settings::load(const std::string &filename) {
	pt::ptree tree;
	pt::read_ini(filename, tree);
	width = tree.get_value_optional<std::size_t>("board.width").get_value_or(10);
	height = tree.get_value_optional<std::size_t>("board.height").get_value_or(10);
	pt::ptree::const_assoc_iterator it = tree.find("board.alives.alive");
	if (it == tree.not_found()) {
		for (pt::ptree::value_type &v : tree.get_child("board.alives")) {
			aliveCells.push_back(v.second.data());
		}
	}
}

lecz kompilator wyrzuca mi błąd z implementacji ptree. Jakiś pomysł jak rozwiązać ten problem?

Error	C2228	left of '.get_value' must have class/struct/union	Game	c:\boost_1_62_0\boost\property_tree\detail\ptree_implementation.hpp	727	

A tu kod do którego się odnosi:

    template<class K, class D, class C>
    template<class Type, class Translator> inline
    optional<Type> basic_ptree<K, D, C>::get_value_optional(
                                                Translator tr) const
    {
        return tr.get_value(data()); //<- tutaj
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1