Fragen zu GetPrivateProfileString
-
Hallo Leute,
kann mir jemand einen Tip geben ??
Ich möchte mit GetPrivateProfileString eine ini Datei einlesen.
Jetzt wird die Ini Datei nicht von mir gefüllt, sondern von x belibigen.
Nun möchte ich unter einem bestimmten z.b [common] alle einträge haben.
Der Inhalt der ini Datei:
[common] 1=c:\lol\;Hallo 2=d:\test\;JetztHier der Source:
char EinPfad[500]; DWORD destSize; int zaehler = 1; destSize=500; do { GetPrivateProfileString("common",CUtil::IntinString(zaehler).c_str(),"NULL",EinPfad,destSize,m_cDaten.getIniPfad().c_str()); std::cout << EinPfad << std::endl; zaehler++; }while(zaehler <= 2);Kann mir jemand sagen wie ich die Anzahl auslese, so dass ich diese nicht vordefenieren muß
Gruß und Danke
andy_mann
-
Schau Dir mal MSDN: GetPrivateProfileSection an.
Holt eine komplette Sektion (in Deinem Falle [common]) aus der INI.
Einzelne Keys sind durch '\0' voneinander getrennt, abgeschlossen ist der String mit '\0\0'.Oder evtl. GetPrivateProfileSectionNames.
Holt nur die Namen aller Keys in der Sektion.
-
hmm..
ich danke DIr,
ich komme allerdings nicht so ganz zu recht, was Du mit \0 und \0\0 meinst.
Woher weiss er denn, wann er am ende ist ??
Gruß
andy_mann
-
Hallo, kann mir keiner Helfen ??
einen einzelnen Bereich bekomme ich heraus, aber nicht wenn mehrere einträge unter einander stehen...
Gruß
andy_mann
-
Du musst einfach den Pointer um die Stringlänge + 1 (0-Zeichen) weitersetzen - wenn dann ein leerer String kommt gibt es keine weiteren Einträge mehr

Und sei mal nicht so ungeduldig

-
Also Leute,
ich glaub ich bin zu blöd,
ich bekomme es nicht hin...char EinPfad[500]; int zaehler = 0; do { GetPrivateProfileSection("Such Objekt",EinPfad,zaehler,"test.ini"); if(EinPfad+1 == '\0') { std::cout << EinPfad << endl; } zaehler++; }while(EinPfad+1 != '\0\0');Gruß
andy_mann
-
1.) Wenn du die ini-Datei im Programm-Verzeichnis ablegst solltest du eine absolute Pfad-Angabe verwenden.
2.) GetPrivateProfileSection muss nur ein Mal aufgerufen werden. Es wird dann in den Buffer (muss groß genug sein) der Inhalt der Section in Form eines String-Arrays eingelesen. Um dies auszulesen gehst du es in einer while-Schleife durch und setzt immer den Pointer um lstrlen(buffer)+1 weiter.
Wenn du die Schlüssel aber systematisch durchnummeriert hast könntest du auch alles einzeln auslesen (erst 1, dann 2, usw. bis du nur noch den Default-Wert bekommst)
-
Das sieht dann ungefähr so aus (ungetestet):
char buffer[1024]; int zaehler = 1024; GetPrivateProfileSection("Such Objekt",EinPfad,buffer,"c:\\deinpfad\\test.ini"); while(lstrlen(buffer) != 0) { std::cout << buffer<< endl; buffer += lstrlen(buffer) + 1; }
-
sorry, ich sehe wahrscheinlich jetzt den Baum vor Bäumen nicht.
Es tut nicht....
error C2664: 'GetPrivateProfileSectionA' : Konvertierung des Parameters 3 von 'char [1024]' in 'unsigned long' nicht moeglich
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
error C2106: '+=' : Linker Operand muss ein L-Wert seinFür was setzt Du den
int zaehler = 1024;ein ?
Gruß
andy_mann
-
so geht's
int main(int argc, char *argv[]) { char buffer[512]; GetPrivateProfileSection("common", buffer, sizeof(buffer), "d:\\test.ini"); char *pBuffer = buffer; while(strlen(pBuffer) != 0) { std::cout << pBuffer << std::endl; pBuffer += strlen(pBuffer) + 1; } system("pause"); return 0; }achtung bei der grösse des buffers, siehe:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getprivateprofilesection.asp
-
Ooohhh vielen Dank,
es tut.
Man war das eine Geburt.
Zu dem Buffer, das heißt max 500 einträge sind möglich ?Ich benütze nur Win 2000 od. Win XP.
Die einträge werden nicht mehr als ca. 100 werden.
Sollte also gehen.
Gruß
andy_mann
-
andy_mann schrieb:
Zu dem Buffer, das heißt max 500 einträge sind möglich ?
nein, die einträge (alle) dürfen nicht grösser sein als 512bytes.
1zeichen == 1byte, dazu kommen noch die terminierungen ('\0').andy_mann schrieb:
Die einträge werden nicht mehr als ca. 100 werden.
dann müsstest du den buffer vergrössern.
bsp: 512 / 100 = ~5 zeichen pro eintrag
-
ahja,
ich habe ihn auf 20480 erhöht,
das sollten dann 200 Zeillen mit a ca. 100 Zeichen sein.
-
bei solchen werten solltest du dir überlegen ob es nicht sinn macht alles in eine andere datei zu speichern.
#include <iostream> #include <string> #include <vector> int main(int argv, int *argc[]) { ifstream file("test.txt"); vector<string> str_vec; string temp; while(getline(file, temp)) str_vec.push_back(temp); }