-
12.08.11 14:22 #1Kloppo2011 Tutorials.de Gastzugang
Moin Leute,
ich möchte Konfigurationseinstellungen für mein Programm aus einer .ini-Datei auslesen, verarbeiten und auch neue Einträge hineinschreiben. Ist es sinnvoll hierfür eine .ini-File zu benutzen oder doch besser ein XML-File nehmen? Was ist warum besser? Der Zugriff auf die Parameter in der .ini ist einfacher, aufgrund von vorimplementierungen oder?
Weiterhin muss ich aus einer Liste von Farben, den Farbcode rausziehen und diesen dann in der .ini-Datei hinterlegen.
Danke für eure Hilfe
-
Hallo,
ein Patentempfehlung gibt es sicherlich nicht.
Eine INI-Datei hat den Vorteil, das die Einträge relativ einfach gelesen oder geschrieben werden können, auch ohne die von dir genannten Vorimplementiierungen. Bei XML tut man sich da schon schwerer. Außerdem ist die händische Bearbeitung für Nichtinformatiker einfacher zu bewerkstelligen.
XML erlaubt eine geordnete Ablage auch bei komplexeren, hierachischen Konfigurationsstrukturen. Da auch entsprechende Bibliotheken verfügbar sind, ist das Lesen/Schreiben auch kein großes Problem.
Fazit: Im Sinne einer einfachen Handhabung ist die INI-Datei vorteilhafter, während im Hinblick auf strukturierte Datenablage die XML-Datei besser ist.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
12.08.11 16:04 #3Kloppo2011 Tutorials.de Gastzugang
OK Danke für die Antwort!
Habt Ihr zufällig auch ein Bespiel für die beiden Möglichkeiten?
Gibt es eine andere Möglichkeit als GetPrivateProfileString**** Ich muss nämlich mehrer Parameter aus der Ini-Datei zusammensetzen.
Grüße
-
Was meinst du damit? Eine INI-Datei ist relativ einfach gestrickt und besteht aus einfachen Schlüssel-Wert-Paaren. Viel mehr Möglichkeiten, als mit GetPrivateProfileString() möglich ist, gibt es nicht.
Für XML brauchst du einen Parser, z.B. TinyXML
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
15.08.11 08:56 #5Kloppo2011 Tutorials.de Gastzugang
Hey,
folgende Problemstellung:
Meine Ini:
Code :1 2 3 4
[Parameter] gmlfile = C:\temp\COL.gml gml2picexe = C:\OGDF\gml2pic\gml2pic.exe bildformat = pdf
Nun muss ich die beiden Parameter einlesen und zusammenfügen, damit es so aussieht:
system("\"C:\\OGDF\\gml2pic\\gml2pic.exe\" -pic pdf \"C:\\temp\\COL.gml\"");
Hier mein Versuch: (Fehler keine passende Konvertierung von String to const char!
Code :1 2 3 4 5 6 7
GetPrivateProfileString("Parameter", "gml2picexe", "error", puffer, puffer_size, ini); string test = puffer; GetPrivateProfileString("Parameter", "bildformat", "error", puffer, puffer_size, ini); test = test + "-pic" + puffer + "-arrows last -margin 20"; GetPrivateProfileString("Parameter", "outputpath", "error", puffer, puffer_size, ini); test = test + puffer + "-arrows last -margin 20" + puffer; system(test); //hier ist der Fehler
Nächste Frage, gibt es vll. elegantere Lösungen Möglichkeiten? Ist es hier besser mit XML zuarbeiten oder gibt es elegantere Möglichkeiten INI-Files zu lesen?
Danke für eure Hilfe!
-
Hi
Das hat mit ini vs. xml aber gar nichts zu tun...
Die Funktion system will einfach keine string-Klasse,sondern ein pures Array aus Buchstaben, das den Inhalt bildet.
So kannst du das umwandeln:
Code cpp:1
system(test.c_str());
Gruß
-
15.08.11 11:53 #7Kloppo2011 Tutorials.de Gastzugang
Das weiß ich wohl, trotzdem würde ich gerne wissen, welche Lösung eleganter ist? XML vs. INI****
Und kann ich mehrere Werte aus einer INI-Datei über eine Schleife in ein Array schreiben, anstatt immer wider s.u. aufzurufen?
Ansonsten muss ich später ca. 50 - 400 mal GetPrivateProfileString aufrufen, da ich sehr sehr viele Einträge auslesen bzw. schreiben muss.Code :1
GetPrivateProfileString("Parameter", "inputpath", "error", puffer, puffer_size, ini);
Also folgende gesamte Problemstellung:
Die Ini-Datei sieht folgendermaßen aus:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[Parameter] inputpath = test.gml outputpath = COL.gml gml2picexe = C:\OGDF\gml2pic\gml2pic.exe bildformat = pdf [Color_Cluster] F1 = #000000; F2 = #ffffff; usw. [Color_Subcluster] F1 = #000000; F2 = #ffffff; usw. [Color_Node] F1 = #000000; F2 = #ffffff; usw.
Hier können bis zu 800 Einträge drinstehen. Beim ersten Programmstart sollen die Color_Optionen geschrieben werden und die Farben aus einer Liste herausgeholt werden. Beim zweiten, dritten usw. Programmstart sollen die Farben ausgelesen werden. Also muss ich zuerst prüfen, ob die Einträge vorhanden sind oder nicht und sie dann entweder schreiben oder lesen. Einigermaßen verstanden? Ich kann ja schlecht jede einzelnen Farbcode mit getpßrivateprofilestring auslesen.
Danke für eure kreativen Ideen!
Grüße
-
Warum verzichtest du nicht einfach GetPrivateProfileString und lädst die Datei komplett herein?
In eine Liste oder so jeweils die [...] mit Liste aus den Einträgen.
Da kannst du dann herumändern/lesen/suchen, wie du willst.
Wenn alles fertig ist,schreibst du das Komplette wieder in die Datei.
Gruß
-
15.08.11 12:44 #9Kloppo2011 Tutorials.de Gastzugang
Könntest du mir ein kleines Beispiel geben?
Ich bekomme Daten aus einer Datei sogn. Cluster, diesen Clustern muss ich eine Farbe (Farbcode) zuweisen. Nun soll für jeden Cluster eine Farbe aus der Farbliste.txt
ausgewählt werden und dem Cluster zugewiesen werden (Zuweisung an die Cluster keine Problem, dass hab ich schon), danach soll der Name des Cluster mit dem zugewiesenen Farbcode in meiner Ini-Datei gespeichert werden.Code :1 2 3
ffffff 000000 usw.
Beim nächsten Programmstart soll nun geschaut werden, ob der Cluster schon eine Farbe in der Ini-Datei zugewiesen bekommen hat und wenn ja, diese verwenden und wenn nein eine Farbe aus der Farbliste.txt ziehen und wiederum in der Ini-Datei hinterlegen. Es darf jedoch nicht derselber Farbcode genommen werden, da zuvor bereits schon einer Komponente zugewiesen wurde.Code :1 2 3 4
[XYZ] abc = "ffffff" def = "000000" usw.
Vielen Dank für eure HilfeGeändert von Kloppo2011 (16.08.11 um 11:47 Uhr)
-
17.08.11 10:53 #10Kloppo2011 Tutorials.de Gastzugang
So ich poste mal meine bisherige Lösung, vll. kann mir dann ja jemand weiterhelfen.
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
std::deque<string> inicodes; std::deque<string> codes; std::string code, le, inicode; int test =0; fstream fs; fs.open("c:/Project_OGDF/CPL/Release/ColourCodes.txt", ios::in, ios::binary); if (! fs) { cerr << "cannot open file ColourCodes.txt for input\n"; system("pause"); } while (fs >> code) { if (! fs.eof()) { codes.push_back(code); } else { cerr << "cannot read file ColourCodes.txt for input\n"; system("pause"); } } fs.close(); for (i = 1; i< C.numberOfClusters(); i++) { le = codes.front(); //Greift auf erstes Element der Liste zu! codes.pop_front(); //Löscht erstes Element aus der Liste! le = "#" + le; CA.clusterFillColor(i) = le.c_str(); inicode = CA.clusterLabel(i).cstr(); inicode = inicode + " = " + le; inicodes.push_front(inicode); } fs.open("c:/Project_OGDF/CPL/Release/config.ini", ios::app, ios::binary); if (! fs) { cerr << "cannot open file config.ini for input\n"; system("pause"); } else { for (icode = inicodes.begin(); icode != inicodes.end(); ++icode) { cout << *icode << endl; fs <<endl <<*icode; } } fs.close();
1. Frage: Kann man das irgendwie einfacher bzw. schöner programmieren?
2. Jetzt muss ich noch die Überprüfung bzw.den Abgleich zwischen den Einträgen in der ColourCodes.txt mit der config.ini programmieren für die Farbcodes.
Nach der ersten Programmausführung sieht die Ini jetzt so aus:
Code :1 2 3 4 5 6 7 8 9 10 11
[Parameter] inputgmlfile = C:\temp\MCG.gml outputgmlfile = C:\temp\COL.gml gml2picexe = C:\OGDF\gml2pic\gml2pic.exe imageformat = pdf [Colouring] Cluster Green = #7FFFB2 Cluster Red = #FF6699 Cluster Blue = #FF6666 Cluster Yellow = #FFB2B2
Jetzt müssen halt die Farben die zu dem jeweiligem Cluster gehören beim 2. Programmstart ausgelesen werden und evtl. neue Farben für weitere Cluster hineingeschrieben werden.
Grüße und Danke
-
17.08.11 11:05 #11
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.Es würde mehr Sinn machen, die Schleife in einem else Block anzuschließen. Besser ist explizit die .is_open() Methode zu benutzen.
Diese if-Abfrage ist unnötig und falsch. Lass sie einfach weg.
Ansonsten, warum verwendest du denn nicht eine ini Bibliothek?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
17.08.11 12:30 #12Kloppo2011 Tutorials.de Gastzugang
Danke Änderungen durchgeführt. Hast du ein Beispiel?
DankeGeändert von Kloppo2011 (17.08.11 um 14:19 Uhr)
-
17.08.11 12:50 #13
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Eine Bibliothek ist fertiger Code der eine bestimmte Aufgabe erledigt. Eine ini Bibliothek ist...

http://www.compuphase.com/minini.htm
Es gibt evtl. andere / bessere
Man muss das Rad nicht neu erfinden... :-o
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
17.08.11 16:48 #14Kloppo2011 Tutorials.de Gastzugang
Meine Ini:
Code :1 2 3 4 5 6 7 8 9 10
[Parameter] inputgmlfile = C:\temp\MCG.gml outputgmlfile = C:\temp\COL.gml gml2picexe = C:\OGDF\gml2pic\gml2pic.exe imageformat = pdf [Colouring] Cluster Yellow = #FFB2B2 Cluster Blue = #FF6666 Cluster Red = #FF6699
Ich muss jetzt die Section Colouring auslesen und die Parameter einzeln betrachten. Ich probiere gerade mit eine Map bekomme sie nur nicht vernünftig gefüllt.
Ich denke getprivateprofilesection macht nicht zuviel Sinn, weil in der Section später bis zu 800 Einträge stehen können.
Habt Ihr nen Vorschlag?
-
Warum bekommst du die Map nicht vernünftig gefüllt?
Code? Fehlermeldungen? Verhalten des Programms?
Ähnliche Themen
-
Zeilenweise aus Ini Datei lesen und in neue Datei schreiben
Von Putzwied im Forum C/C++Antworten: 2Letzter Beitrag: 27.04.07, 08:16 -
.ini Datei schreiben und lesen[MX]
Von nitro-Merlin im Forum Flash PlattformAntworten: 4Letzter Beitrag: 31.05.05, 17:27 -
Aus Datei lesen und in eine andere Datei schreiben
Von Computerpinguin im Forum C/C++Antworten: 1Letzter Beitrag: 03.05.05, 14:29 -
Datei lesen und schreiben
Von Tobiax im Forum C/C++Antworten: 1Letzter Beitrag: 22.07.04, 12:32 -
Datei lesen und schreiben
Von Wolfsbein im Forum PHPAntworten: 3Letzter Beitrag: 14.04.02, 17:00



1Danke

Zitieren


Login






