Daten aus Datei in bestimmte Vars einlesen - cleverer Weg?



  • Ich habe momentan ein kleines Logistik-Problem, sozusagen. Ich lese eine Datei ein, in welcher Variablen und ihre zugehörigen Werte gespeichert sind. Die Anordnung dieser Variablen ist dabei nicht vorbestimmt, kann also variieren. Nun lese ich also die Datei ein und muss aufgrund der unbestimmten Ordnung jede einzelne Variable testen, worum es sich eigentlich bei ihr handelt, damit ich ihren Wert in der korrekten Variable des Programms speichern kann.

    Das sieht dann beispielhaft folgendermaßen aus:

    // Variable + Wert einlesen
    ...
    // Testen, was eingelesen wurde und in die richtige Variable schieben
    if (var == "foo") foo = value;
    if (var == "bar") bar = value;
    

    Da ich nun jede Menge Variablen in der Datei speichere, würde ich gern wissen, ob es einen cleveren Weg gibt, um der Testerei Herr zu werden und den Vorgang evtl. gar zu automatisieren. Gerade in Anbetracht der Möglichkeit, dass mehr und mehr Variablen hinzukommen können, wäre eine weniger "manuelle" Vorgehensweise sinnvoll.

    Bin für jeden Rat dankbar!



  • Wenn die Variablen alle den gleichen Typ haben, dürfte das gut mit einer Map gehen:

    // Deine Variablen
    int foo, bar, zoo;
    // Diese map bildet immer je einen String auf einen int-Zeiger ab.
    map<string,int*> vars;
    vars["foo"] = &foo;
    vars["bar"] = &bar;
    vars["zoo"] = &zoo;
    
    // Einlesen
    string varname = ...;
    int varval = ...;
    
    // Gucken, ob der Variablen-Name existiert
    if ( vars.find( varname ) == vars.end() )
        ; // Fehler, Variablenname ist nicht in der Map!
    
    // Wert in der Variable speichern
    *vars[varname] = varval;
    // Oder, vielleicht verständlicher:
    int* ptr = vars[varname];
    *ptr = varval;
    


  • Wenn es verschiedene Typen sein sollen, kannst Du als Type für den Wert der Map auch eine Union nehmen.

    union VarContainer
    {
        float fValue;
        int iValue;
        double dValue;
    };
    
    typedef std::map<std::string, VarContainer> VarMap;
    

    Alles andere, wie Badestrand es vorschlägt.



  • Danke schonmal für die Antworten, sieht sehr vielversprechend aus. Das Beispiel mit map konnte ich ohne Probleme bei mir integrieren, da ich allerdings verschiedene Typen nutze, wäre map in Kombination mit union sinnvoll - damit habe ich aber Probleme. Momentan bin ich hier:

    union VarContainer {
     int iValue;
     bool bValue;
     char cValue;
    };
    
    typedef map <string, VarContainer> VarMap;
    
    VarMap tVars;
    
    tVars["foo"] = &foo; // Fehler
    

    Ich nehme mal an, dass es soweit stimmt, allerdings durchschaue ich die Logik noch nicht ganz. Definiere ich jetzt nämlich die Map wie es Badestrand zeigte (letzte Zeile), so bekomme ich die Fehlermeldung

    error: expected constructor, destructor, or type conversion before '=' token

    Danke im Voraus für Eure Hilfe.



  • Auch an dich: Bitte statt den C-Sharp Tags die C/C++ Tags für C++ Code verwenden...

    Wenn du einen union verwendest musst du auch auf das entsprechende Element zugreifen (Wehe auf das falsche).

    tVars["foo"] = &foo; // Fehler
    
    // Die Zeile müsste heißen:
    tVars["foo"].iValue = &foo; // ... oder ...
    tVars["foo"].fValue  = &foo; // ... oder ...
    

    cu André



  • Hätte ich vielleicht dazuschreiben sollen, aber diese Version probierte ich bereits, mit derselben Fehlermeldung:

    error: expected constructor, destructor, or type conversion before '.' token

    Was läuft da schief?


  • Mod

    blueglasses schrieb:

    Hätte ich vielleicht dazuschreiben sollen, aber diese Version probierte ich bereits, mit derselben Fehlermeldung:

    error: expected constructor, destructor, or type conversion before '.' token

    Was läuft da schief?

    wie sieht denn die Funktion insgesamt aus bis zu diesem Punkt?



  • Ok. Ich Depp habe natürlich die Wertzuweisung irgendwo rumliegen gehabt, wo sie nicht hingehörte, und zwotens gehört mein Thema wohl in das WinAPI-Forum. Tut mir leid, da habe ich mich evtl. ein wenig vertan.

    Der Quelltext sieht momentan so aus:

    union VarContainer {
     int iValue;
     bool bValue;
     char cValue;
    };
    
    typedef map <string, VarContainer*> VarMap;
    
    VarMap tVars;
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
     tVars["foo"] = &foo;
     tVars["foo"].iValue = &foo;
    }
    

    Die erste Zeile in der WinMain erzeugt wie erwartet
    error: cannot convert `int*' to `WindowVarContainer*' in assignment

    Die zwote allerdings spuckt dies hier aus:
    error: request for member `iValue' in `(&tVars)->std::map<_Key, _Tp, _Compare, _Alloc>::operator[] [with _Key = std::string, _Tp = WindowVarContainer*, _Compare = std::lessstd::string, _Alloc = std::allocator<std::pair<const std::string, WindowVarContainer*> >](((const std::string&)(&string(((const char*)"itest"), ((const std::allocator<char>&)((const std::allocator<char>)(&allocator<char>())))))))', which is of non-class type `WindowVarContainer'

    Sorry, bin hier und da wirklich noch ein Anfänger. Danke nochmal für die Hilfe!


Log in to reply