Werte aus einer Config-Datei holen



  • Hallo,

    das ist mein erster Post hier Forum.
    Ich schreibe gerade in C++ ein Programm, dass vom Spiel "World of Tanks" Chanzen etc berechnet, also 1 vs 1 sozusagen. Dazu muss ich ALLE Panzer registrieren mit deren wichtigsten Daten, also Leben, Schaden, Panzerung und Durchschlagskraft. Das wäre natürlich ziemliche Schreibarbeit. Also möchte ich dass die Werte aus einer Config geholt werden. Wie stelle ich das nun bei einer Consolenanwendung an?

    Wäre für jede Hilfe dankbar, eventuell wenn man noch den Code etwas erklärt, weil ich noch recht neu bin mit C++.

    MfG
    Lukas


  • Mod

    Die Frage ist zu allgemein, um dir konkret helfen zu können. Wir kennen schließlich weder das Spiel, die Panzer noch das Format der Konfigurationsdatei.

    Daher die allgemeine Antwort: Du wirst ja vermutlich (auch wieder etwas, was man nach deiner Frage nur raten kann) irgendeine Art Klasse für die Panzer haben, die deren Werte hält. Der verpasst du eine Funktion (wenn du es schön haben willst, nennst du sie operator>>), die aus einem gegebenen istream einen Datensatz liest.

    Dann öffnest du im Hauptprogramm einen Dateistream zu deiner Konfigurationsdatei und machst eine Schleife die so lange läuft, bis ein Lesefehler auftritt. War das Lesen erfolgreich, hast du einen fertigen Panzer.

    Hilfreich? Vermutlich bist du darauf schon alleine gekommen. Oder falls du nicht drauf gekommen bist, dann hast du die Antwort auch nicht verstanden. Siehe daher auch den ersten Link in meiner Signatur (und die dort weiter verlinkten Seiten), wie du Fragen so stellen kannst, dass ein wildfremder Helfer dir eine hilfreiche Antwort geben kann.



  • OK, als Configformaz wäre doch .yml oder ,cfg mein Vorschlag. Wie gesagt, ich bin relativ neu In C++ und habe kaum Ahnung davon. Wäre nett wenn mir mal jemand diesbezüglich helfen kann. Oder mir nen guten Link dazu schickt.





  • Hallo Lukas,

    Willkommen im C++-Forum.

    anbei ein sehr einfaches Beispiel, wie man eine INI-Datei einlesen kann

    #include <iostream>
    #include <map>
    #include <string>
    #include <sstream> // istringstream
    #include <fstream>
    
    struct Ini
    {
        template< typename T >
        T get( const std::string& key ) const
        {
            std::map< std::string, std::string >::const_iterator i = values_.find( key );
            if( i != values_.end() )
            {
                std::istringstream buf( i->second );
                T x;
                if( buf >> x )
                    return x;
            }
            return T(); // Wert war nicht konfiguriert oder im falschen Format
        }
        std::map< std::string, std::string > values_;
    };
    std::istream& operator>>( std::istream& in, Ini& ini )
    {
        ini.values_.clear();
        for( std::string key, value; getline( getline( in, key, '=' ), value ); )
            ini.values_.insert( make_pair( key, value ) );
        return in;
    }
    
    int main()
    {
        using namespace std;
        ifstream iniDatei("input.txt");
        if( !iniDatei.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return -2;
        }
        Ini konfig;
        if( (iniDatei >> konfig).eof() ) // bis Dateiende gelesen, dann ist es Ok
        {
            cout << "Anzahl Panzer: " << konfig.get< int >("AnzPanzer") << endl;
            cout << "Spielerstaerke: " << konfig.get< double >("Force") << endl;
            // usw.
        }
        return 0;
    }
    

    Wenn die Datei 'input.txt' so aussieht:

    AnzPanzer=42
    Force=0.861
    Background=black
    

    .. ist die Ausgabe obigen Programs:

    Anzahl Panzer: 42
    Spielerstaerke: 0.861
    

    Da kann man noch einiges hinzufügen, wie bessere Fehlerbehandlung und das Einlesen von Abschnitten bzw. Blöcken. Eine professioneller Version findest Du bei boost.program_options.

    Gruß
    Werner



  • Lukas97 schrieb:

    Hallo,

    das ist mein erster Post hier Forum.
    Ich schreibe gerade in C++ ein Programm, dass vom Spiel "World of Tanks" Chanzen etc berechnet, also 1 vs 1 sozusagen. Dazu muss ich ALLE Panzer registrieren mit deren wichtigsten Daten, also Leben, Schaden, Panzerung und Durchschlagskraft. Das wäre natürlich ziemliche Schreibarbeit. Also möchte ich dass die Werte aus einer Config geholt werden. Wie stelle ich das nun bei einer Consolenanwendung an?

    Wäre für jede Hilfe dankbar, eventuell wenn man noch den Code etwas erklärt, weil ich noch recht neu bin mit C++.

    MfG
    Lukas

    ich würd Dir Boost.PropertyTree empfehlen. Funktioniert super, ist einfach und kann auch mit verschiedene Formate (ini,xml,json) umgehen.


Anmelden zum Antworten