Ini dateien



  • noppenwelle schrieb:

    will was einfacheres haben *g*

    hmm...Fällt mir auf die Schnelle nix anderes ein, was auch platformunabhängig ist. Das schnell hinzuschreiben ist doch kaum ein Aufwand. Interessanter dürfte Dein Problem erst werden, wenn Du aus dieser IniDatei Werte verändern/löschen willst. Dann mußt Du Dich zwangsweise mit den Strings herumschlagen.

    Willst Du denn nur die Ini-Datei schreiben oder auch erweitern/ändern/löschen, ohne sie jedesmal neu zu schreiben?



  • jo eigentlich will ich das schon 😉



  • Das wird dann etwas aufwendiger, Denn wenn du in der Mitte Zeilen in der Länge änderst, mußt du das ganze File verkürzen oder verlängern.
    In inifiles sind Kommentare erlaubt und ähnliches.



  • Ich hab das so gelöst:

    Eine Liste sammelt ein Pair auf seinen String (Sektion) und den Key.
    Der Key selbst wiederum ist eine Liste auf eine Struktur mit dem Wert des Keys dem Namen des Keys und einem flag ob es ein Kommentar ist.

    struct key
    {
     std::string name;
     std::string wert;
     bool kommentar;
    }
    
    std::list<std::pair<std::string,std::list<key> > >
    
    Alternativ, wenn Du kommentare nicht speichern, sondern wegwerfen willst:
    
    std::list<std::pair<std::string,std::list<std::pair<std::string,std::string> > > >
    

    Lies die Datei zeilenweise ein, werte jede Zeile aus (key section kommentar) und leg es in der Datenstruktur ab.

    Dann Arbeitest Du brav in der Struktur und am ende schreibst Du alles wieder zurück in eine Datei.

    Ist sicherlich nicht die schnellste Variante die es gibt, aber man kann so eigentlich ganz gut Arbeiten vorallem wenn man häufig alle Keys einer Sektion z.B. braucht.

    Bei Interesse sammel ich mal die Implementierung zuammen die ich hab und geb sie mal zum downloaden frei (alles standard). (Ich denke aber das man im Internet wesentlich bessere Lösungen finden kann).



  • Lösungsvorschlag gefällt mir.
    Teile deine Bedennken bezüglich Geschwindigkeit

    Hast du auch Continuation lines und Datenblöcke bedacht.
    Beides ist mir schon untergekommen.

    Continuation lines
    [test]
    key=ajhajdasdkj\
    asöldklöasdkf\
    asdlökjakld\

    Datenblöcke
    [test]
    data=4,5,ahAJKSDH
    221134,554433,223344,123456,00aa00
    00ff00,554453,245344,123456,00aaff
    221134,554433,223554,123456,ffaa00
    22ee34,dd4433,223344,123456,00aa00

    War nur als Ergänzung gedacht

    Viel Spaß



  • Nö an Datenblöcke hab ich noch nicht gedacht.
    Ziel 1 war es die WinAPI aufrufe in der Firma zu ersetzen.
    Ziel 2: Die Reihenfolge der Daten darf nicht geändert werden.

    Um Datenblöcke halten zu können müsste man erst mal die Regeln festlegen.

    Block1=abcdef\
    ghijklmn

    Das würde ich dann so umbauen (Policy) das die Zeilen in einen vector gespeichert werden.

    Datenblöcke:
    Hm, gleiches Problem. Da müsste man Regeln festlegen die man dann implementieren kann. Man muß am anfang erkennen was man hat, das speichern und beim einlesen der nächsten Zeile prüfen ob es passt.

    Block1=abcdef\

    könnte ja auch bedeuten das der Nutzer wirklich abcdef\ haben wollte und keinen
    verbund.

    Was den speed betrifft: Der Profiler sagt mir zumindest das ich nich langsammer geworden bin im gegensatz zur nutzung der WinAPI ;o) Kritisch wirds erst mit der Zeit wenn jede eintragung geprüft werden soll beim einlesen. (Unterstützt einfach einlesen und in die Struktur knallen oder jeden Eintrag kleinlichst prüfen ob er richtig ist. Und das dauert O🤡



  • Genauso ist es gedacht

    [test]
    wert=1234 edfg \ // dies ist ein Kommentar
    asdeg\
    ter
    ="1234 edfg asdegter"

    Die guten alten C-Regeln helfen hier will ich eine Continuation line so ist das letzte Zeichen der Zeile
    ein'\' will den Character so schreibe ich '\'

    Definition von Dateninhalten:
    Alles was dem Gleichheitszeichen in einem ini File nach einem Subkey folgt sind Dateninhalte.
    Dateninhalte bestehen aus einem oder mehreren Data-Items
    Diese werden wie folgt ausgewertet.
    • Kommentare werden entfernt (Kommentarzeichen //)
    • trailing (nachfolgende) Blanks werden entfernt,d.h Blanks nach einem Wort oder einem text
    • Bei Data-items wird zwischen Worten und Texten unterschieden:
    • Definition
    Wort jede Abfolge von Zeichen die nicht durch Whitespace Character aufgebrochen wird, ist
    ein Wort
    Text jede Abfolge von Worten die ¨uber Whitespace Character getrennt ist ist ein Text. Ein
    einzelner oder mehrere aufeinanderfolgende Whitespace Character sind ein Text.
    • Data-Items vom Typ Wort müssen nicht in ” eingeschlossen werden. Beim Lesen werden alle
    Whitespaces vor und alle Characters hinter dem ersten Wort entfernt und als C-String zurückgeliefert.
    • Data-Items vom Type Text müssen in ” eingeschlossen sein. Beim Lesen werden alle Characters
    vor dem ersten und nach dem letzten ” entfernt. Zwischen den beiden ” bleibt alles orginal
    erhalten. Der erste und der letzte ” wird ebenfalls entfernt und als C-String zur¨uckgeliefert.

    Das sind die Regelen, die ich bei uns eingeführt habe. Wir nutzten das INI-File Konzept schon unter DOS für unsere Testgeräte
    und werden es auch weiter nutzen.

    Datenblöcke habe ich öfters gesehen, aber bisher haben wir sie nicht gebraucht und deswegen weder Regeln noch eine
    Implementierung festgelegt.



  • Hmm....

    Das lässt sich doch machen 🤡
    Aber:
    Was ist wenn ich den String "1234 Hallo Welt \" haben will ?

    Ich würde die Implementierung in der Hauptklasse nur soweit ändern das sie in der laage ist Zeilen die ein \ am ende haben zusammenzufügen.

    Den rest, was ein Wort ist und was nicht soll die Anwendungsklasse für sich selbst ausmachen.

    thx für die Anregungen 🤡

    Mehrzeiler haben wir bisher nie im einsatz gehabt... Doch einmal.. Da hab ich die Umbrüche durch ein "\n" ersetzt O🤡



  • Der würde in unserer Darstellung als Text gelten somit im file mit " stehen.

    d.h.

    [test]
    value="1234 Hallo Welt \"

    Das gleiche mit Continuation line

    [test]
    value="1234 "\
    Hallo Welt \"

    Was heißt bei dir am Ende ein "\" haben. Dürfen danach noch whitespace Character und Kommentare stehen oder nicht.

    Habe schlechte Erfahrung gemacht mit Nutzern, die solche Files mit einem ASCII Editor betrachtet oder geändert haben.
    Kommentare und whitespacecharacters nach dem "\" würde ich ignorieren.
    Bei uns umfasst das Lesen einer solchen Keys folgende Schritte

    -lesen der Zeile mit fgets
    -entfernen des "\n" am Ende der Zeile
    -entfernen von Kommentaren
    -entfernen von trailing whitespaces.
    -falls der String leer ist, zurück zum Anfang
    -checken auf und bearbeiten von Continuation lines
    -Ergebnis liefern



  • Heheh da liest Du auch zeilenweise ein :-p
    Lieg ich garnicht mal soweit weg mit meiner Lösung.

    (tipp: mit getline und std::string kann Dir die länge der Zeile egal sein ;o)

    Bei mir war das Ziel mich dicht am verhalten der WinAPI zu halten da diese ersetzt werden sollte. Aber ich werde mal eure Idee klauen und die auch umsetzen 🤡 Das ganze dann als Policy ausgelegt kann sich der Anwender die art der Ini selbst raussuchen 🤡


Anmelden zum Antworten