Fragen zu GetPrivateProfileString



  • 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 sein

    Fü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);
    }
    

Anmelden zum Antworten