tutorials.de Buch-Aktion 05/2012
Seite 1 von 3 123 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
32
ZUGRIFFE
888
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Kloppo2011 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
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  3. #3
    Kloppo2011 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
     

  4. #4
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von Kloppo2011 Beitrag anzeigen
    Ich muss nämlich mehrer Parameter aus der Ini-Datei zusammensetzen.
    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

  5. #5
    Kloppo2011 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!
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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ß
     

  7. #7
    Kloppo2011 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?
    Code :
    1
    
    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 :
    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
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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ß
     

  9. #9
    Kloppo2011 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
    Code :
    1
    2
    3
    
    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 :
    1
    2
    3
    4
    
    [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
    Geändert von Kloppo2011 (16.08.11 um 11:47 Uhr)
     

  10. #10
    Kloppo2011 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
     

  11. #11
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Kloppo2011 Beitrag anzeigen
    Code :
    1
    2
    3
    4
    5
    
    if (! fs) 
    {
        cerr << "cannot open file ColourCodes.txt for input\n";
        system("pause");
    }
    Es würde mehr Sinn machen, die Schleife in einem else Block anzuschließen. Besser ist explizit die .is_open() Methode zu benutzen.
    Zitat Zitat von Kloppo2011 Beitrag anzeigen
    Code :
    1
    2
    3
    4
    5
    6
    
    while (fs >> code) 
    {
        if (! fs.eof()) 
        {
            codes.push_back(code);
        }
    Diese if-Abfrage ist unnötig und falsch. Lass sie einfach weg.

    Ansonsten, warum verwendest du denn nicht eine ini Bibliothek?

    Gruß
    Kloppo2011 bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  12. #12
    Kloppo2011 Tutorials.de Gastzugang
    Danke Änderungen durchgeführt. Hast du ein Beispiel?


    Danke
    Geändert von Kloppo2011 (17.08.11 um 14:19 Uhr)
     

  13. #13
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Kloppo2011 Beitrag anzeigen
    Was genau ist eine ini-Bibliothek und wie kann ich sie nutzen?
    Eine Bibliothek ist fertiger Code der eine bestimmte Aufgabe erledigt. Eine ini Bibliothek ist...
    Zitat Zitat von Kloppo2011 Beitrag anzeigen
    Hast du ein Beispiel?
    http://www.compuphase.com/minini.htm

    Es gibt evtl. andere / bessere
    Zitat Zitat von Kloppo2011 Beitrag anzeigen
    Macht das weniger Arbeit?
    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.

  14. #14
    Kloppo2011 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?
     

  15. #15
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Warum bekommst du die Map nicht vernünftig gefüllt?
    Code? Fehlermeldungen? Verhalten des Programms?
     

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 27.04.07, 08:16
  2. .ini Datei schreiben und lesen[MX]
    Von nitro-Merlin im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 31.05.05, 17:27
  3. Aus Datei lesen und in eine andere Datei schreiben
    Von Computerpinguin im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 03.05.05, 14:29
  4. Datei lesen und schreiben
    Von Tobiax im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 22.07.04, 12:32
  5. Datei lesen und schreiben
    Von Wolfsbein im Forum PHP
    Antworten: 3
    Letzter Beitrag: 14.04.02, 17:00