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.