Daten aus Einstellungstextdatei für Programm einlesen



  • Hallo,

    ich habe folgendes Problem. Mir liegt eine "einstellungen.txt" Datei in folgendem Format vor.

    <abc>
    Name_Wert1 = 12;
    Name_Wert2 = 13;
    Name_Wert3 = 24;
    </abc>
    

    Nun soll eine Funktion geschrieben werden, die sowohl den Namen als auch den Wert ausliest. Dies soll die Funktion solange machen, wie Werte vorhanden sind. Das erste Problem, was ich hier sehe ist das ich wahrscheinlich 2 Funktionen benötige, da ich nicht weiß, wie ich 2 unterschiedliche Dateitypen mit einer Funktion zurückgeben soll.

    Letztlich sollen zwei arrays zurückgegeben werden. Eins mit den int Werten und eins mit den entsprechenden strings... z.B.:

    a[1] = Name_Wert1;
    b[1] = 12; // entsprechender Wert zu a[1]

    Wie kann man das am einfachsten realisieren?

    Ich habe mir den "Anfang" in etwa so vorgestellt. Wobei hier wieder mehrere Probleme auftreten... Ich glaube einfach ich stelle mir das ganze zu kompliziert vor. Vllt. hat ja jmd. eine Idee.

    vector<double> readConfig(const char* filename,const char* attributeName){
        ifstream f(filename);
    
            //solange Zeilen ignorieren, bis der Tag gefunden wurde
        while(!isAttributeTag(f,tag,attributeName)){
            f.ignore( numeric_limits< streamsize >::max(), '\n' );
        }
            //die Zeile des Tags ebenso ignorieren
        f.ignore( numeric_limits< streamsize >::max(), '\n' );
    
            //nun jede folgende Zeile in value schreiben und solange das Ende nicht erreicht ist
        string value;
        f >> value;
        while ( value != "</abc>"){
            // Auslesevorgang
        }
        return values;
    }
    


  • // Headers
    #include <iostream> // cout, string
    #include <fstream>  // ifstream
    #include <map>  // map
    #include <stdlib.h> // atoi
    
    // Shorteners
    using namespace std;
    typedef map<string,int> Config;
    
    // Load config from file to memory
    Config readConfig(const char* filename){
        // Create config storage
        Config config;
        // Create file handle
        ifstream fin(filename);
        // Create buffer for a line
        string line;
        // Position of found
        size_t pos;
        // Iterate through file lines
        while(fin.good()){
            // Get current line
            getline(fin,line);
            // Validate line for parsing
            pos = line.find(" = ");
            if(pos != string::npos)
                // Save line entry to config storage
                config[line.substr(0,pos)] = atoi(line.substr(pos+3).c_str());
        }
        // Return config
        return config;
    }
    
    // Program entry
    int main(){
        // Read config
        Config config = readConfig("input.txt");
        // Test access on key
        const char key[] = "world";
        if(config.count(key))
            cout << config[key] << endl;
        // Exit
        return 0;
    }
    

    Hierbei wird das <abc> und </abc> noch ausser Acht gelassen, sowie die Zeichen nach den Zahlen ignoriert.
    Man kann den Code verbessern, z.B. durch andere Methoden zum Zahlenlesen oder weiterer Syntax-Rücksicht.

    Soviel erstmal.


Anmelden zum Antworten