Problem: Werte aus Datei in Map einlesen?


LadyMarion

Mitglied
Hallo,

ich hab mal wieder eine Frage bzw. ein Verständnisproblem...

Zunächst mal um was es geht:
Ich habe eine Datei, die beim Lesen direkt in eine Map eingelesen wird.
Die Datei sieht folgendermaßen aus:
Code:
ABC | 1.2 | Hier steht ein Double-Wert
DEF | 5 | Hier ein Int-Wert
GHI | TEST | Hier ein String
Vorne steht also immer der Key, dann kommt ein Wert (Double, Int oder String) und dann kann noch ein Kommentar stehen.

Um die Map nachher einfacher aufrufen zu können, gibt es eine zusätzliche Klasse, die die unterschiedlichen Werte unterscheidet.

Hier mal der Code, der so auch funktioniert (hab ihn nur auf das Wesentliche beschränkt und z.B. auch die Int-Werte weggelassen, da sie analog zu Double funktionieren):

Code:
class VarData
{
   string data_;

public:
   VarData() {}
   VarData(const string& d) : data_(d) {} // was passiert denn hier genau?

   double Double() const;
   inline const string& String() const
   {
      return data_;
   }
};

class Input : public map<string, VarData>
{
public:
   Input(const string& filename);
   virtual ~Input();

   double Double(const string& key);
   string String(const string& key);
   void read(const string& filename);
};



Implementierung der Klasse:
Code:
string removeWhitespaces(const string& s)
{
   istringstream ss(s);
   string newS;
   ss>>newS;
   return newS;
}

vector<string> split(const string& line)
{
   int p1 = line.find('|');
   int p2 = line.rfind('|');
   if (p1<0 || p2<0 || p1==p2) throw string ("invalid line format");
   string key = line.substr(0, p1);
   size_t begin = line.find_first_not_of(' ',p1+1);
   size_t end = line.find_last_not_of(' ',p2);
   string value = line.substr(begin, (end - (begin+1)));
   string comment = line.substr(p2+1);

   vector<string> parts;
   parts.push_back(removeWhitespaces(key));
   parts.push_back(value);
   parts.push_back(comment);

   return parts;
}

double VarData::Double() const
{
   istringstream ss(removeWhitespaces(data_));
   double value;
   ss>>value;
   if (!ss.eof()) throw ("\""+data_+"\" is not a double");
   return value;
}

// Constructor/Destructor
Input::Input(const string& filename)
{
   read(filename);
}

Input::~Input()
{
}

// Memberfunctions
double Input::Double(const string& key)
{
   if (find(key) != end())
      return operator[](key).Double();
   else return -12345.;
}

string Input::String(const string& key)
{
   if (find(key) != end())
      return operator[](key).String();
   else return ("UNKNOWN");
}

void Input::read(const string& filename)
{
   ifstream IN (filename.c_str());
   while (!IN.eof())
   {
      string line;
      getline(IN, line);
      istringstream ss(line);
      string s;
      ss>>s;
      if (s[0] != '#' && !s.empty())
      {
         try
         {
            vector<string> parts=split(line);
            operator[](parts[0])=VarData(parts[1]);
         }
         catch (string errmsg)
         {
            cout<<errmsg<<endl;
         }
      }
   }
}



Aufruf in der main-Funktion:
Code:
int main()
{
   Input IO("daten.txt");

   double bsp1 = IO.Double("ABC");
   string bsp2 = IO.String("GHI");

   return 0;
}


Jetzt mein Problem:
So werden über den Operator ja nur die Werte ausgelesen. Wie kann ich nun auch den Kommentar auslesen? Am Besten dann analog zu den Werten über eine Comment()-Funktion. Ist das irgendwie möglich?

Bin für jede Hilfe dankbar!!
 

Forum-Statistiken

Themen
272.355
Beiträge
1.558.613
Mitglieder
187.829
Neuestes Mitglied
AlDi31