2011-01-17 42 views
2

Ich habe ein Problem in C++, und ich hoffe, dass ein Experte hier mir helfen könnte.Lesen von Variablen aus Textdatei

das Problem ist, gibt es eine TXT-Datei, die einige Informationen hat. Ich möchte ein Programm schreiben, das diese Informationen verwendet.

die TXT-Datei wird wie folgt sein:

variable 1: 711 
variable 2: [8 5 6 11] 
variable 3: xyz zyx yyy 

sollte das Programm die Werte aus der Datei lesen und sie dann verwenden, eine Ahnung, wie es zu tun !!?

/* UPDATE */

, was getan werden soll, ist aus der Textdatei die numerischen Werte zu lesen, nur die numerischen Werte der Variablen, und dann diese Werte in dem realen Programm verwenden.

zum Beispiel wird der Wert von Variable 1 gelesen und in eine Variable x eingegeben, dann können wir im Programm int y = 7 * x;

Ich weiß, wie man eine Datei liest, aber was ich nicht weiß ist, wie bestimmte Werte der Variablen gelesen werden.

Grundsätzlich sollte das Programm die Datei lesen, den Namen der Variablen erkennen, den Wert abrufen und dann verwenden.

vielen Dank

+3

Was ist dein Problem? Hast du schon einen Code? Warum scheitert es? –

+1

bitte genauer sein coz das schreiben einer variablen in datei ist einfach in zwei zeilen zu machen! – Sudantha

+0

Haben Sie Einschränkungen bezüglich der '.txt' Datei oder können Sie das Format ändern? – ereOn

Antwort

1

Ich denke, es in Ihrer Frage implizit ist, dass die Variablen verschiedene Typen, wie Zahlen, Arrays oder Strings haben könnte. In diesem Fall müssen Sie entscheiden, ob verwenden boost::any<> oder boost::variant<> sagen, oder Ihren eigenen Variablentyp ala erstellen:

struct Var 
{ 
    enum { Double, String, Array } Type; 
    Type type_; 

    double double_; 
    std::string string_; 
    std::vector<double> array_; 

    Var(Type t) : type_(t), double_(0) { } // empty double/string/array 
    Var(double d) : type_(Double), double_(d) { } 
    Var(const std::string& s) : type_(String), string_(s) { } 
    ... 
}; 

Alternativ können Sie C++ 's eingebauten Polymorphismus verwenden und eine Basisklasse und eine abgeleitete Klasse für jeden realen -world Datentyp Es kann sogar genug sein, dass Sie die textuelle Darstellung immer speichern und alles in einem std::string speichern. Wie auch immer Sie es tun, nehmen wir an, Sie speichern Werte in einem Typ namens "Type".

Es scheint, dass der Name der Variablen auf der linken Seite des Doppelpunkts angegeben werden soll. Wenn Sie wissen, dass die entsprechenden Variablen in Ihrem Programm fest codiert sind, können Sie diese vorhandenen Variablen auf die Werte auf der rechten Seite setzen. Andernfalls müssen Sie Variablen dynamisch erstellen, die diesen Bezeichnernamen zugeordnet sind. Dies kann mit einem Schlüssel std::map<std::string, Type> Keyed On erfolgen. Sie könnten es wie folgt auffüllen:

std::map<std::string, Type> variables; 

variables["age"] = Type(28); 
variables["name"] = Type("Fred"); 

Zum Parsen der eigentlichen Textdatei können Sie Iostreams verwenden. Lesen Sie eine Zeile zu einem Zeitpunkt ala:

std::string line; 
while (getline(cin, line)) 
{ 
    std::string::pos n = line.find(':'); 
    if (pos != std::string::npos) 
    { 
     std::string identifier = line.substr(0, n - 1); 
     Type var; 
     { 
      // try parsing it as a number... 
      std::istringstream iss = line.substr(n + 1); 
      char c; 
      double d; 
      if (iss >> d && !(iss >> c)) 
       var = d; 
     } 

     { 
      // try parsing it as an array... 
      std::istringstream iss = line.substr(n + 1); 
      var.clear(Array); 
      double d; 
      if (iss >> c && c == '[') 
       while (iss >> d) 
        result.array_.push_back(d); 
       if (iss && iss >> c && c == ']' && !(is >> c)) 
        // parsed successfully as an array - use "result" 
     } 
     { 
      // it's a string... 
      var = line.substr(n + 1); 
     } 

Sie sollten versuchen, einen Start auf, dies zu machen und bitten um spezifische Hilfe, wo Sie stecken bleiben.

Hinweis: Sie finden es möglicherweise einfacher, ein funktionierendes (wenn auch langsames) Programm zu finden, das diese Anforderung in einer Sprache wie Ruby, Python oder Perl erfüllt.

+0

Vielen Dank für Ihre Hilfe – Makoo

2

Es sieht so aus, als ob Sie eine Konfigurationsdatei haben möchten, um einige Informationen für Ihr Programm zu speichern. Es gibt viele Implementierungen der Verwaltung von Konfigurationsdateien (Lesen, Abrufen, Speichern, Speichern).Ich bleibe zu klein und bequem libconfig: http://www.hyperrealm.com/libconfig/ Es unterstützt Integer, Floating-Point und Boolesche Variablen und Arrays, Listen und geschlossene Abschnitte auch.

+0

Das ist genau das, was ich will, vielen Dank. Ich werde daran arbeiten, und dann werde ich zurück sein. – Makoo

Verwandte Themen