Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Konfigurationsdatei einlesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.11.2005, 14:44 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Ich hab mir folgende Funktion erstellt um eine Konfigurationsdatei einzulesen. Allerdings gefällt mir das ganze irgendwie nicht weil es IMHO nicht sonderlich schnell ist und viele (wahrscheinlich) unnötige Stringvergleiche durchführt.
Vielleicht habt ihr ja ein paar Ideen/Anregungen wie ich das schöner machen könnte.

C++:
HRESULT ReadConfig()
{
    ENTRIES        tmp;
    string        line;
    ifstream    file("cdm.cfg");
    int            i=0;
    bool        bDataBlock = false;
    while(!file.eof())
    {
        
        getline(file,line);
        if (line[0] == '#' || line == "")
            continue;
        if (line == "[DATA BEGIN]")
        {
            bDataBlock = true;
            continue;
        }
        if (line == "[DATA END]")
        {
            g_.Entries.push_back(tmp);
            bDataBlock = false;
            continue;
        }
        if (bDataBlock)
        {
            if (line == "[***]")
            {
                g_.Entries.push_back(tmp);
                tmp.Description = tmp.Name = tmp.Path = tmp.Picture = "";
                i=0;
                continue;
            }
            ++i;
            switch (i)
            {
            case 1:
                tmp.Name = line.substr(line.find_first_of('=')+1);
                break;
            case 2:
                tmp.Path = line.substr(line.find_first_of('=')+1);
                break;
            case 3:
                tmp.Picture = line.substr(line.find_first_of('=')+1);
                break;
            case 4:
                tmp.Description = line.substr(line.find_first_of('=')+1);
            }
        }
        else
        {
            if (line.substr(0,6) == "Title=")
            {
                SetWindowText(g_.hMainWindow,line.substr(6).c_str());
                continue;
            }
        }
    }
    return 0;
}



C++:
struct ENTRIES
{
    string Name;
    string Path;
    string Picture;
    string Description;
};

struct GLOBALS
{
    HWND hMainWindow;
    HINSTANCE hInst;
    vector<ENTRIES> Entries;
    bool Paint;
}g_;



Ein Beispiel für so eine Datei wäre folgendes

Zitat:

#dgfhdgreirgieg
#dgjnegrjnregrner

[DATA BEGIN]
NAME=name1

PFAD=ddownloads\uvga3_359.zip

BILD=c1.jpg
BESCHREIBUNG=erster test dkugfh dkdfkg dkg dktgh tdgh thg fgb fdkg dtgjndfghftghrtfhtrfbht fthrtfhj flthbjnflh fthj fth flbhlfhlfjh

#lfjvdilvjdlfbdlbolb
[***]

name=name2
pfad=epfad2\2.exe
bild=2.bmp
beschr=zweiter test

[***]

#dflvdfkn

name=name3
bild=3.bmp
beschr= drgndrkg dgndkgn drlgndgkrln

[***]

name=test3
path=cwindows\notepad.exe
bild4.bmp
beschr=dfkbjndbj srigvoi blabla
[DATA END]

Title=Test


Innerhalb von [Data Begin] und [Data End] sollen halt die eigentlichen Daten für in den vector stehen und außerhalb davon andere Daten wie der Titel für das Programmfenster.
Leerzeilen oder Zeilen die mit einer Raute beginnen sollen ignoriert werden.
Der Aufbau der Datei ist im Prinzip egal. Es sollte nur möglichst einfach zu verstehen und ausfüllbar sein.

Naja bin mal gespannt was ihr dazu sagt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.11.2005, 15:25 Uhr
ao

(Operator)


Das Ganze funktioniert nur dann richtig, wenn die Einträge für Name, Pfad, Bild und Beschreibung (1) alle da sind und (2) in dieser Reihenfolge auftauchen, wobei der Bezeichner links vom =-Zeichen noch nicht mal ausgewertet wird - du könntest also genausogut

Code:
bla = test3
blubb = c:\windows\notepad.exe
zack = bild4.bmp
hurz = Irgend ne schlaue Beschreibung


hinschreiben, Hauptsache es gibt in jeder Zeile ein =-Zeichen und die Reihenfolge ist eingehalten.

Das ist arg missverständlich, weil so ein (Name=Wert)-Format irgendwie impliziert, dass die Reihenfolge unwichtig ist und dass die Daten über das Name-Feld identifiziert werden.

Tipp: Schreib eine Funktion, die eine Zeile in zwei Teile (links und rechts vom =-Zeichen) zerhackt, wenn ein =-Zeichen da ist, und sonst nichts tut:

C++:
bool separate ( std::string & left        // output linker Teil
              , std::string & right       // output rechter Teil
              , const std::string & input
              , char separator = '='      // oder ein anderes Trennzeichen
              );                          // true, wenn zerhackt wurde, false wenn nicht
                                          // (kein Trennzeichen gefunden)



ao

Dieser Post wurde am 02.11.2005 um 15:29 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.11.2005, 15:42 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von ao:
Das ist arg missverständlich, weil so ein (Name=Wert)-Format irgendwie impliziert, dass die Reihenfolge unwichtig ist und dass die Daten über das Name-Feld identifiziert werden.


hmm stimmt das könnte zu missverständnissen führen. vor dem auswerten des Strings vor dem = hab ich mich bisher gedrückt weil es das noch mehr aufbläht. Aber da werd ich wohl nicht drumherum kommen wenn es vernünftig werden soll...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: