Ini-Datei lesen, schreiben o. besser XML?

K

Kloppo2011

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
 
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
 
Hey,

folgende Problemstellung:
Meine Ini:
Code:
[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:
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:
C++:
system(test.c_str());

Gruß
 
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?
Code:
GetPrivateProfileString("Parameter", "inputpath", "error", puffer, puffer_size, ini);
Ansonsten muss ich später ca. 50 - 400 mal GetPrivateProfileString aufrufen, da ich sehr sehr viele Einträge auslesen bzw. schreiben muss.

Also folgende gesamte Problemstellung:
Die Ini-Datei sieht folgendermaßen aus:
Code:
[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ß
 
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
Code:
ffffff
000000
usw.
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:
[XYZ]
abc = "ffffff"
def = "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.

Vielen Dank für eure Hilfe
 
Zuletzt bearbeitet von einem Moderator:
So ich poste mal meine bisherige Lösung, vll. kann mir dann ja jemand weiterhelfen.
Code:
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:
[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
 

Neue Beiträge

Zurück