Einfache Configurationsdatei (ini, conf) in C++ einbinden und verarbeiten!



  • Morgen!

    Da mir bisher alle Seiten auf denen irgendetwas von ini-Einbindung usw. stand nicht geholfen haben frage ich einmal hier: Welche Dateieibindungsmethode ist am einfachsten? Und wie verwendet man diese?
    Könnt ihr mir da ein Beispiel geben?

    MFG



  • Wenn du unter Windows arbeitest und windows.h einbindest, dann sind ini-Files doch ziemlich bequem. Du benutzt einfach die GetPrivateProfile[...] und SetPrivateProfile[...] Funktionen, fertig.

    EDIT: Beispiel:

    int i=GetPrivateProfileInt("mysection","myKey",0 /*default value*/,"C:\\test.ini");
    

    So oder so ähnlich. 😉



  • #include <Windows.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	char URL[100];
    	char Bereiche[100];
    
    	DWORD destSize;
    
    	destSize=100;
    
    	GetPrivateProfileString("max","test","NULL",URL,destSize,"test.ini");
    	cout<<URL;
    	cout<<Bereiche;
    	return 0;
    }
    

    so sieht mein code aus und mein ini file:

    [max]
    test=eintrag1
    

    aber die ausgabe ist NULL!

    was ist falsch?!



  • Wo liegt die ini-Datei? Gib mal einen absoluten Pfad an.



  • das bringt auch nichts. immer noch ausgabe: NULL



  • lpFileName
    [in] Pointer to a null-terminated string that specifies the name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.



  • Also das hier funktioniert garantiert:

    int main() 
    { 
    	char URL[100]; 
    	DWORD destSize=sizeof(URL);
    
    	WritePrivateProfileString("max","test","meinteststring","c:\\test.ini"); 
    	GetPrivateProfileString("max","test","NULL",URL,destSize,"c:\\test.ini"); 
    
    	cout<<URL; 
    	return 0; 
    }
    

    Irgendwas machst du falsch. Ich vermute, dass du keinen absoluten (kompletten!) Pfad angibst. Vielleicht hast du im Literal auch einfache Backslashes geschrieben...? Irgendeinen Grund muss es ja geben, dass er deine Datei nicht findet.



  • aber warum braucht das ding denn einen absoluten pfad?! ich habe das jetzt mal genauso gemacht wie du mir das gesagt hast:

    #include <Windows.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char URL[100];
        DWORD destSize=sizeof(URL);
    
        WritePrivateProfileString("max","test","meinteststring","c:\\Users\Max\test.ini");
        GetPrivateProfileString("max","test","NULL",URL,destSize,"c:\\Users\Max\test.ini");
    
        cout<<URL;
        return 0;
    }
    

    aber es geht trotzdem nicht! der compiler zeigt mir auch zwei fehler an:

    10:61 [Warning] unknown escape sequence '\M'
    16:5 [Warning] unknown escape sequence '\M'

    was heißt das jetzt?!

    mfg



  • ahja doch es geht, wenn ich statt c:\...nur d:\\test.ini eingebe, wie kriege ich denn jetzt nen pfad in meinen ordner?! sorry für doppelpost! 🙂

    mfg



  • "c:\\Users\Max\test.ini"

    Was machst du denn hier? Du notierst zuerst einen doppelten Backslash, dann aber nur einzelne? Mach dich bitte mal schlau, was Escapesequenzen sind.

    Wenn du einen Backslash in einem Stringliteral haben willst, dann musst du '\' notieren (das ist eine Escapesequenz, im String steht dann ein einzelner Backslash). Das Warum wird klar, wenn man daran denkt, dass jede Escapesequenz (z.B. \n, \r) mit einem Backslash eingeleitet wird. Daher muss der Backslash selbst auch durch eine Escapesequenz realisiert werden. Jetzt solltest du auch die Warnungen (keine Fehlermeldungen!) verstehen. Du versuchst, eine Escapesequenz '\M' zu benutzen, die es aber gar nicht gibt. Alles klar? 🙂





  • achso...dankeschön. ich wusste nicht das das ein string ist, aber jetzt ist das irgendwie logisch! 😃
    MFG



  • Blake_MaX schrieb:

    achso...dankeschön. ich wusste nicht das das ein string ist, aber jetzt ist das irgendwie logisch! 😃
    MFG

    Das heißt? Problem gelöst? Oder wie? 🙂



  • Ich weiss nicht, entweder bin ich besonders blöd oder... :
    Ich verwende dafür ne eigene Klasse, die so ne .ini-Datei in eine map liest, wobei die Section der Schlüssel ist und diese enthält wieder eine map des Werts und des Namens. Alle Änderungen laufen im Speicher. Beim Programmende (oder beim Aufruf von Flush() ) wird das ganze wieder auf die Platte geschrieben.
    Gelesen wird die .ini zeilenweise und dann der Wert vor dem ersten "=" als Schlüssel betrachtet und alles dahinter als Wert, wenn die Zeile nicht mit einem "[" beginnt. Eventuelle Leerzeichen werden einfach getrimmt.
    So ist das ganze 100%-XPlatform.
    rya.


Anmelden zum Antworten