Externe Konfiguration nur einmal einlesen



  • Hallo,

    ich hoffe ich bin hier richtig mit meiner Frage.
    Falls sie selten dämlich sein sollte und eigentlich jeder wissen müsste, entschuldige ich mich schon vorher. Ich bin noch ein ziemlicher Anfänger in der Welt von C++.

    Ich habe mir ein kleines Konsolen-Spiel geschrieben. Nun habe ich eine neue Funktion, mit der der Benutzer sich am Anfang ein Profil erstellen kann (eigener Name, Schwierigkeitsgrad uvm.) welches dann in einer separaten Datei gespeichert wird.

    Um an diese Daten zu kommen hab ich mir eine Funktion geschrieben, die die Datei einfach komplett einliest, alle Informationen in Variablen speichert und per Funktionsaufruf kann ich die Infos dann abfragen und verwenden.

    Nun dachte ich mir aber: Das müsste ja (bei einem größerem Programm) extrem aufwändig sein und unnötige Ressourcen verbrauchen, wenn diese Datei immer und immer wieder neu eingelesen wird. Viel praktischer wäre es doch, die Datei einmalig einzulesen (bei Programmstart) und diese Sachen irgendwie intern für die ganze Dauer der Laufzeit zwischenzuspeichern?
    Die Frage ist nun: Wie kann man sowas realisieren?


  • Mod

    Gedankenausbruch schrieb:

    Um an diese Daten zu kommen hab ich mir eine Funktion geschrieben, die die Datei einfach komplett einliest, alle Informationen in Variablen speichert und per Funktionsaufruf kann ich die Infos dann abfragen und verwenden.

    Dann lass doch einfach das erneute Einlesen weg und benutz die Variablen, die du dir gespeichert hast!



  • Aber werden die denn nicht gelöscht bzw. nur gespeichert in dem Moment wo ich die Funktion verwende?

    Mal ein Beispiel was ich meine:

    Config::Config() {
    }
    
    int Config::GetSettings(std::string key) {
    
    int config;
    
    // Ums einfach zu halten spar ich mal den Teil mit dem Einlsen und nehm einen festen wert
    
    if(key == "mode") {
        config = mode;
    }
    
    return config;
    
    }
    
    int main() {
    
        Config Config;
    
        int schwierigkeit = Config.GetSettings("Mode");
    
        return 0;
    }
    

    In dem Moment wo ich die Funktion in main aufrufe bzw. den Wert hole wird die Datei doch immer nue eingelesen? Heißt wenn ich später irgendwoanders nochmal den Schwierigkeitsgrad abrufen möchte (in einer anderen Funktion z.B), dann muss ich doch die Funktion wieder aufrufen und die Datei muss jedesmal wieder eingelesen werden?

    Das dürfte doch auf Dauer (wenn ich das nun immer und immer wieder in verschiedenen Dateien/Funktionen brauche) ziemlich Ressourcen-Lastig sein?
    Oder sehe ich das falsch?



  • Deine Variable schwierigkeit ist in main gültig. Bis main zu Ende ist, also im Prinzip für den restlichen Programm Ablauf. Die Variable kannst du natürlich als Parameter an andere Funktionen, in denen du die brauchst, übergeben.

    Edit: Typings, oder auch scheiß Autocorrect.



  • Schlangenmensch schrieb:

    Deine Variable schwierigkeit ist in main gültig. Bis main zu Ende ist, also im Prinzip für den restlichen Programm Ablauf. Die Variable kannst du natürlich als Parameter an andere Funktionen, in denen du die brauchst, übergeben.

    Edit: Typings, oder auch scheiß Autocorrect.

    Ja, das weiß ich. Aber ich dachte es gäbe vielleicht eine andere Möglichkeit, dass ich die Datei einmal einlese und die Variablen quasi immer "global" verfügbar habe ohne jedes mal daran denken zu müssen die Daten aus der main an die anderen Funktionen weiterzugeben.

    Aber Danke, dann werd ich das wohl so machen. 🙂


  • Mod

    Gedankenausbruch schrieb:

    Ja, das weiß ich. Aber ich dachte es gäbe vielleicht eine andere Möglichkeit, dass ich die Datei einmal einlese und die Variablen quasi immer "global" verfügbar habe ohne jedes mal daran denken zu müssen die Daten aus der main an die anderen Funktionen weiterzugeben.

    Aber Danke, dann werd ich das wohl so machen. 🙂

    Ja, das geht auch. Das wäre sogar eine sehr gute Art und Weise das zu machen. Dein Config ist eine Klasse? Die verfügt doch sicherlich über alle Daten. Und dann kannst du selber bestimmen, wo und wie lange Instanzen dieser Klasse mit allen Daten leben.



  • Die Instanz von Config, die du in main erzeugst ist ja auch gültig bis zum Ende von main. Es spricht ja nichts dagegen, dass du diese dann an andere Funktionen deines Programms übergibst.

    In der Klasse Config, könntest du die eingelesenen Werte z.B. in einer Map speichern und bei Bedarf wieder abrufen ohne neu einlesen zu müssen.



  • Gedankenausbruch schrieb:

    Ja, das weiß ich. Aber ich dachte es gäbe vielleicht eine andere Möglichkeit, dass ich die Datei einmal einlese und die Variablen quasi immer "global" verfügbar habe ohne jedes mal daran denken zu müssen die Daten aus der main an die anderen Funktionen weiterzugeben.

    Aber Danke, dann werd ich das wohl so machen. 🙂

    Du könntest über den Einsatz des Singleton Patterns nachdenken. Für so Config Sachen bietet sich das an.



  • Die Instanz von Config, die du in main erzeugst ist ja auch gültig bis zum Ende von main. Es spricht ja nichts dagegen, dass du diese dann an andere Funktionen deines Programms übergibst.

    Naja, für mich spräche dagegen, dass ich dann Daten die ich das ganze Spiel immer brauche (z.B den Schwierigkeitsgrad) und das auch in fast jeder Funktion, immer wieder übergeben muss. Da wäre es praktischer wenn das ganze einfach einmal Global verfügbar wäre.

    Die anderen Tipps schau ich mir mal an, vielleicht bekomme ich da ja was gutes hin. Danke euch schonmal für die Antworten.


Anmelden zum Antworten