Datenstruktur für .ini Files
-
SirLant:
Ich selbst hab mir auch mal so eine Klasse geschrieben die INI-Files einliest und schreibt und hab auch als Typ " std::map< std::string , std::map < std::string , std::string > > " benutzt.
Das klappt wunderbar und du kannst ja auf die Werte per Key zugreifen.
z.b.
string value1 = ini_map["section1"]["Key1"];
MfG eViLiSSiMo
-
Musste mich oben leider kurz fassen, da ich grad abgeholt wurde. Dachte da, dass ne Map eigentlich eher schlecht ist, da ich das ganze ja in erster Linie für mich mache und ich die Namen nicht kenne, da sie wohl im sequentiellen Zugriff wohl langsamer sein wird.
Aber nach genauerer Überlegung bin ich zu dem Entschluss gekommen, dass das ja gar nicht der Fall ist, da ne Map ja von der Struktur genauso Element für Element durchgegangen werden kann.Dann werd ich ne map<string, map<string, string> > nehmen
-
Hi!
Habe eine Bibliothek geschrieben, die wir für ne C-Seminaraufgabe schreiben sollten, also ich verwende folgendes als ich die Implementierung nach C++ konvertiert habe:
map<string, map<string, string> >;
Grund:
Schlüssel ist ein Chapter, dieser enthält wederum mehrere Schlüsselwertpaare, welche ich wieder in einer map Speicher.EDIT: Oh, ich hatte mich verlesen, der Vorschlag war ja schon da...
Code-Hacker
-
del
-
Bin grad irgendwie zu blöd den map iterator zu benutzen, der muss für ne map<string, map<string,string> > doch so aussehen map::iterator<string, map<string, string> > oder?
-
map<string, map<string,string> >::iterator
-
Bekomme auch so nen Fehler
e:\Sources\CPP\HelloWorld\HelloWorld.cpp(16): error C2440: 'Initialisierung': 'std::map<_Kty,_Ty>' kann nicht in 'std::_Tree<_Traits>::iterator' konvertiert werden
with
[
_Kty=std::string,
_Ty=std::mapstd::string,std::string
]
and
[
_Traits=std::_Tmap_traits<std::string,std::mapstd::string,std::string,std::lessstd::string,std::allocator<std::pair<const std::string,std::mapstd::string,std::string>>,false>
]
-
Wo bekommst du diesen Fehler? Wie sollen wir was dazu sagen, wenn du nicht das
Codestueck zeigst?mfg
v R
-
Na in der Initialisierung des Iterators, so wie es DrGreen oben geschrieben hat.
std::map<std::string,std::map<std::string, std::string> >::iterator foo2 = foo1;
foo1 ist std::map<std::string,std::map<std::string, std::string> > foo1; (da meckert er auch nicht und die Map funktioniert auch)
-
SirLant schrieb:
Na in der Initialisierung des Iterators, so wie es DrGreen oben geschrieben hat.
std::map<std::string,std::map<std::string, std::string> >::iterator foo2 = foo1;
foo1 ist std::map<std::string,std::map<std::string, std::string> > foo1; (da meckert er auch nicht und die Map funktioniert auch)
foo1 ist aber kein iterator. Einen solchen musst du aber liefern, z. B. so:
std::map<std::string,std::map<std::string, std::string> >::iterator foo2 = foo1.begin();
mfg
v R
-
Danke, hätte wohl schon früher mal etwas mehr mit iteratoren arbeiten sollen, aber das werd ich jetzt mal nachholen
-
Nach etwas tüfteln hab ich jetzt folgendes um die Map auszugeben und es scheint richtig zu sein, aber geht das nicht auch einfacher, kommt mir etwas kompliziert vor
Typedefs werd ich natürlich benutzen, aber das war ja nur zu testzwecken
for (std::map<std::string,std::map<std::string,std::string> >::iterator foo2 = foo1.begin(); foo2 != foo1.end(); ++foo2) { cout << foo2->first << endl; for (std::map<std::string,std::string>::iterator foo3 = foo2->second.begin (); foo3 != foo2->second.end(); ++foo3) cout << "\t" << foo3->second << endl; cout << endl << endl; }
-
und was is daran so kopliziert ?
-
map<string, map<string, string> >::iterator iter;
usw...
Wie war das nochmal mit dem selbst nachdenken??
-
fsljkhdykvb schrieb:
map<string, map<string, string> >::iterator iter;
usw...
Wie war das nochmal mit dem selbst nachdenken??Das hat doch DrGreen bereits gesagt und wie du siehst hab ich ja alles bereits zum laufen bekommen.
DEvent ich wollte wissen ob es auch "einfacher" bzw. kürzer geht, oder ob das der normale Weg ist, so wie ich es jetzt habe.
-
SirLant schrieb:
fsljkhdykvb schrieb:
map<string, map<string, string> >::iterator iter;
usw...
Wie war das nochmal mit dem selbst nachdenken??Das hat doch DrGreen bereits gesagt und wie du siehst hab ich ja alles bereits zum laufen bekommen.
DEvent ich wollte wissen ob es auch "einfacher" bzw. kürzer geht, oder ob das der normale Weg ist, so wie ich es jetzt habe.
Wie du bereits angedeutet hast, geht man den langen Schreibsessions aus dem Weg,
indem man hier mit typedef's arbeitet.Kuerzer geht es ansonsten nicht.
mfg
v R
-
Nach dem stressigen Wochenende hab ich heut endlich mal die Zeit gefunden mir Gedanken über das Design zu machen, aber mir gefällt das irgendwie nicht, was sagt ihr dazu
class IniReader /*Nen besseren namen such ich noch, wer hat Vorschläge?*/ { IniReader (string filename = ""); // Speichert den Dateinamen in fname ~IniReader (); // Macht gar nix, da ja alles automatisch gelöscht wird // Copy- und Zuweisungsoperator werden implementiert open (string filename); // Macht das gleiche wie der CTor oben close (); // Entfernt den fname und leert die map read (); // Die Datei wird geöffnet und eingelesen const_map_iter getContent (); // Liefert nen Iter auf den Anfang // der map, sind die Daten noch //nicht eingelesen, werden sie bei //der ersten Anfrage eingelesen //Variablen string fname; bool read; };
Wie gesagt irgendwie gefällt mir die Art nicht, wobei es von außen ja ganz praktisch ist, ich geb den Dateinamen an und hol mir die Daten einfach über nen Methodenaufruf und gemäß der LazyEvaluation wird die Datei erst gelesen, wenn sie wirklich gebraucht wird.
-
Hat keiner daran etwas auszusetzen
-
Ich würds so machen:
typedef map<string,map<string,string> > IniData; IniData read_ini_file(string); void write_ini_file(string,IniData);
Ich sehe eigentlich nicht warum man das in eine Klasse stopfen soll, wenn es ein typedef auch tut.
-
Hi!
@SirLant:
Also ich habe es ein wenig sehr anders gemacht. Habe einige Methoden mehr, die einzelne Aufgaben übernehmen. Diese werden von einer Hauptroutine aufgerufen. Zudem kann man sich die Werte als String, int oder double zurückliefern lassen.Hier hast du eine Beschreibungen:
http://www.fh-wedel.de/~bek/c/uebss04/ueb07ia.html
In dem Link wird auf eine andere Übung verwiesen, allerdings gefällt mir persönlich der Parser oben der die Whitespaces nur am Anfang und Ende entfernen soll besser, als der der alle entfernen soll:
http://www.fh-wedel.de/~bek/c/uebss04/ueb07.htmlVielleicht gibt's dir ja ein paar Gedankenanstösse, allerdings ist die iniLibrary.h in C, wobei es kein Problem sein sollte daraus eine Klasse zu machen.
Code-Hacker