Mehrere Sektionen aus *.ini File auslesen
-
Hallo Leute,
ich sitze gerade an einem Projekt und brüte nun schon seit einiger Zeit an folgendem Problem:
Ich hab eine *.ini File und die sieht grob umschnitten etwa so aus->[12342_332_12]
blub=bla
lab=lubdadi
ring=ringdi[3324_2456_24]
blub=Blublablong
lab=Dingongdond
ring=rubiddubidu
......Also die Sektionsnamen ändern sich immer aber die Schlüssel bleiben gleich. Ich hatte jetzt gedach: Cool einfach ne schleife um alles drum herum bauen und einfach von Sektion zu Sektion springen und jeweils immer die selben Schlüssel auslesen. Leider habe ich aber bis jetzt nichts gefunden, wie ich von Sektion zu Sektion springen könnte. Hab da überhaupt keine Idee wie ich da vorgehen kann. Kennt ihr da vielleicht einen Ausweg?
Für Hilfe wäre ich sehr sehr dankbar.Gruß
Michael
-
Du hast die Anleitung nicht gelesen?
GetPrivateProfileStringlpKeyName [in]
The name of the key whose associated string is to be retrieved. If this parameter is NULL, all key names in the section specified by the lpAppName parameter are copied to the buffer specified by the lpReturnedString parameter.Also einfach einen Query ausführen mit lpKeyName==NULL. Du bekommst dann alle Keys zurück die drin sind.
Dann kannst Du locker Deine Schleife drüber laufen lassen.
-
Hallo Martin,
danke für deine Antwort. Ja das habe ich gelesen. Es wird dann ein String erstellt in dem dann alle Sektionen geschrieben werden die jeweils mit einer 0 getrennt sind und wo das Ende mit 00 erreicht ist. Aber irgendwie verstehe ich noch nicht, wie man da jetzt eine Schleife drüber legen kann? Bzw. wie frage ich das am Geschicktesten ab.
Mein Ansatz warfor(i=0; i=imax ;i++){ GetPrivateProfileString(i,"blub",NULL,blub,maxsize,strPfad); GetPrivateProfileString(i,"lab",NULL,lab,maxsize,strPfad); GetPrivateProfileString(i,"ring",NULL,ring,maxsize,strPfad); }
Mir ist schon klar, dass das mit dem i nicht funktioniert, aber nur mal als Beispiel beschrieben.
Zweitens gibt es in meinem Fall auch noch das Problem, dass ich vorher nie sagen kann, wie viele Sektionen auftreten können also müsste der zu reservierende Speicher für den String, in dem die Sektionen geschrieben werden sollen, automatisch zugewiesen werden. Oder gibt es da was eleganteres?
Ich hoffe ich habe mich etwas verständlich ausgedrückt. Wenn nicht bitte ich um Verbesserung. Nur so kann ich was lernen
Gruß
Michael
-
Warum fängst Du nicht einfach mal an, etwas effektiv zu schreiben und gezielt zu fragen was Du nicht verstehst. Ich habe "ehrlich gesagt" keine Lust Dir die Lösung zu Coden.
1. Du kannst ermmitteln wie groß der Buffer sein muss!
If neither lpAppName nor lpKeyName is NULL and the supplied destination buffer is too small to hold the requested string, the string is truncated and followed by a null character, and the return value is equal to nSize minus one.
Also fängst Du mit einer Puffergröße von sagen wir 2kb an, und verdoppelst diese einfach, bis die Daten passen.
2. Da es sich um einen jeweils mit 0 termirten String handelt ist die Schleife doch elementar einfach.
for (TCHAR*pWork=pStart; *pWork; pWork+=_tcslen(pWork)+1) { (( pWork zeigt auf den nächsten Gruppen-Eintrag ... }
Wenn Du Anfänger bist, dann solltest Du durch den Versuch lernen... auch durch den Versuch zu verstehen wie etwas geht...
-
Vielen Dank nochmal Martin!!
Ja ich werde mich jetzt hinsetzten und mal loslegen. Werde dann eine Lösung bzw. Frage posten wenn es soweit ist. Dann auch mit Code (Stichwort 'Leistungsnachweis')
Hast natürlich recht mit deiner Antwort Martin: nur Versuch mach kluch. Mir ging es darum, weil ich halt Anfänger bin, ob es nicht vielleicht schon eine Methode oder sowas hierfür gibt.
Schönen Tag euch noch!
gruß Michael
-
Hallo Leute,
also ich hab mich jetzt eingelesen und verstehe trotzdem nicht wie das funktionieren soll... ich hab folgenden Code geschrieben:CStringArray sections; char *pStart=new char[100]; GetPrivateProfileString(NULL,NULL,NULL,pStart,destSize,strPfad); //Ab hier auslesen der Sektionen for(TCHAR *pWork= pStart; *pWork; pWork+=_tcslen(pWork)+1) { sections.Add(pWork); }
Jetzt wird alles wunderschön erstellt, so wie ich es mir vorgestellt habe. Aber ich verstehe überhaupt nicht was da passiert! Hab ich pStart überhaupt richtig deklariert? Macht man das so? Ein paar erleuchtende Worte wären echt super.
Im nächsten Schritt (nachdem ich das andere einfach mal so hingenommen habe) hab ich dann folgendes geschrieben um auch die einzelnen Schlüssel aus der .ini File zu bekommen:
CStringArray adresse; CStringArray varName; CStringArray wert; CStringArray buttonName; CStringArray status1; CStringArray status2; for(int i=0;i<sections.GetSize();i++) { //varName *pStart=NULL; GetPrivateProfileString(sections.GetAt(i),"varName",NULL,pStart,destSize,strPfad); for(TCHAR *pWork= pStart; *pWork; pWork+=_tcslen(pWork)+1) { varName.Add(pWork); } //buttonName *pStart=NULL; GetPrivateProfileString(sections.GetAt(i),"buttonName",NULL,pStart,destSize,strPfad); for(TCHAR *pWork= pStart; *pWork; pWork+=_tcslen(pWork)+1) { buttonName.Add(pWork); } //wert *pStart=NULL; GetPrivateProfileString(sections.GetAt(i),"wert",NULL,pStart,destSize,strPfad); for(TCHAR *pWork= pStart; *pWork; pWork+=_tcslen(pWork)+1) { wert.Add(pWork); } //Adresse *pStart=NULL; GetPrivateProfileString(sections.GetAt(i),"adress",NULL,pStart,destSize,strPfad); for(TCHAR *pWork= pStart; *pWork; pWork+=_tcslen(pWork)+1) { adresse.Add(pWork); } //status1 *pStart=NULL; GetPrivateProfileString(sections.GetAt(i),"status1",NULL,pStart,destSize,strPfad); for(TCHAR *pWork= pStart; *pWork; pWork+=_tcslen(pWork)+1) { status1.Add(pWork); } //status2 *pStart=NULL; GetPrivateProfileString(sections.GetAt(i),"status2",NULL,pStart,destSize,strPfad); for(TCHAR *pWork= pStart; *pWork; pWork+=_tcslen(pWork)+1) { status2.Add(pWork); } }
aber das scheint totale grütze zu sein. Hat auch ne Menge damit zu tun, dass ich diese Pointerzählerei nicht verstanden habe. Also es wird wohl was ausgegeben (hab da testweise einfach mal Werte mit der AfxMessageBox ausgegeben). Teilweise stimmen die Werte auch und dann wieder auch überhaupt nicht.
Ich hoffe ihr könnt mir helfen, so dass meine ersten Schritte in C++ nicht mehr ganz so frustrierend sind wie jetzt gerade.
Gruß
Michael
-
Hallo!
Hab gestern Abend nochmal über meine Programmierleistung nachgedacht und festgestellt, dass ich den totalen Quatsch gemacht habe. Hab jetzt einfach die Schlüssel ohne diese komischen Schleifen ausgelesen. Hier mal ein Auszug:
*pStart=NULL; GetPrivateProfileString(sections.GetAt(i),"varName",NULL,pStart,destSize,strPfad); varName.Add(pStart);
jetzt passiert genau das, was ich gestern eigentlich schon wollte.
Dies nur nochmal zur Aktualisierung.Aber wäre trotzdem nett, wenn sich jemand meiner Fragen von gestern annimmt.
gruß Michael