ERLEDIGT
NEIN
NEIN
ANTWORTEN
0
0
ZUGRIFFE
474
474
EMPFEHLEN
-
12.08.08 10:36 #1
- Registriert seit
- Mar 2005
- Beiträge
- 41
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:
Vorne steht also immer der Key, dann kommt ein Wert (Double, Int oder String) und dann kann noch ein Kommentar stehen.Code :1 2 3
ABC | 1.2 | Hier steht ein Double-Wert DEF | 5 | Hier ein Int-Wert GHI | TEST | Hier ein String
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
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 :1 2 3 4 5 6 7 8 9
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!!
Ähnliche Themen
-
mehrere werte aus datei einlesen und in einzelnen variablen speichern?
Von Sidahan im Forum JavaAntworten: 2Letzter Beitrag: 20.11.10, 21:09 -
Werte aus XML-Datei Einlesen
Von Henig im Forum .NET DatenverwaltungAntworten: 13Letzter Beitrag: 09.08.10, 14:45 -
Werte aus einer Datei einlesen...
Von Paule123x im Forum C/C++Antworten: 5Letzter Beitrag: 02.07.08, 12:28 -
Problem beim Datei einlesen und Werte zurückgeben
Von LadyMarion im Forum C/C++Antworten: 7Letzter Beitrag: 22.01.08, 20:06 -
Hex-werte aus Datei in Integer einlesen
Von genfrosch im Forum JavaAntworten: 2Letzter Beitrag: 08.07.05, 15:14





Zitieren
Login






