Ini lesen == zuwenig zeichen



  • Ich grüsse,

    hab ein kleines problem 😞 wie bekokmmich es hin das mir meinen Funtkion alle werte meinern INI liest???

    if (direktory == "")
        {
            char *direkt = new char[500];
            int laenge = GetCurrentDirectory(499,direkt);
            direkt[laenge] = NULL;
            direktory.Format("%s",direkt);
            delete []direkt;
        }
    	char *pBuf = new char[500];
    	for(int i = 0; i < 500; ++i)
    	{
       		GetPrivateProfileSection(section,pBuf,i,direktory + "\\" + filename + ".ini");
    	}
    //...
    	int h_pos = 0,
    		h_p = 0,
    		h_pos_gleich,
    		i = 0;
    
    	CString returnstring,ausgabe;
    
    	returnstring.Format("%s",pBuf);
    
    	while(!returnstring.IsEmpty())
    	{
    		returnstring.Format("%s",&pBuf[h_p]);
    		h_pos = returnstring.Find('\0');
    
    		ausgabe = returnstring;
    		h_pos_gleich = ausgabe.Find('=');
    
    		ausgabe = ausgabe.Left(h_pos_gleich);
    		if(returnstring != "")
    		{
    			m_clb_user_liste.AddString(ausgabe);
    		}
    		UpdateData(FALSE);
    		h_p += h_pos +1;
    	}
    //...
    	delete []pBuf;
    

    Ein teil dieser Funktion hab ich aus diesen Forum den andern hab ich geschrieben !!!
    das Problemm ist die Anzahl der Zeichen des Char Zeigers... 500 Zeichen reichen bei weiten nicht.... jetzt wäre es ja einfach die anzhal zu erhöhen aber das löst das probelm nicht da ich nie weis wie viele zeichen in der INI stehen!!!

    Wie kann ich das problem lösen ???
    Gibt es da vilelich irgendwie was wie ich die zeichen der INI zählen kann ??

    MfG crasy



  • Du könntest deine Funktion so umschreiben das sie nur noch CString benutzt. In CString Objekte passen beliebig viele Zeichen. Alternativ kannst du, bevor du dein char Feld anlegst, die Dateilänge auslesen (CFile::GetLength) und ein char Array von dieser größe anlegen.



  • OK..... 😕
    Ich muss zugeben ich weis nicht wie ich das machen soll 😞
    Bei CString schreibt der immer das da was nicht konvertieren werden kann und mit einer Array hab ich noch nie gearbeitet.

    Ist das schlecht ????



  • Bin zu Faul deinen Code anzugucken 😃 Sag mal an welcher stelle der meckert..



  • crasy schrieb:

    OK..... 😕
    Ich muss zugeben ich weis nicht wie ich das machen soll 😞
    Bei CString schreibt der immer das da was nicht konvertieren werden kann und mit einer Array hab ich noch nie gearbeitet.

    Ist das schlecht ????

    Hm ok, also hier mal ein kleines Beispiel um das Prinzip zu verdeutlichen (hab jetzt die CString Geschichte weggelasen; hier nur der Code um ein char Feld anzulegen, welches so lang ist wie deine Datei.

    CString Pfad = direktory + "\\" + filename + ".ini"; //von dir übernommen
       CFile   Datei;
    
       if(Datei.Open(Pfad, CFile::modeRead))     //Datei öffnen
       {
           char* pBuf = new char[Datei.GetLength() + 1];  //+1 für '\0', (weis jetzt nicht ob GetPrivateProfileSection(...) Nullterminierte Zeichenketten zurück gibt
           pBuf[Datei.GetLength()] = '\0';
    
           Datei.Close();
    
           //... weiterer Code  
       }
    


  • Erstmal danke für die hielfe aber da gibt es imme rnoch ein Problem 😞

    @Chris++
    Wenn ich deinen Code für die Länge des Char-Felds einarbeite schreibt der mir einen Fehler am anfang!!!

    Fehler:
    "eine unbenannte Datei wurde nicht gefunden"

    Das Programm arbeitet zwar aber die Informationen werde nicht aus der Datei gelesen.

    @(D)Evil
    Im grunde hab ich nur die Char durch CString ersetzt!!!
    Ich weis das kann nicht gehen aber ein verusch war es wert!!
    Fehlercode:

    error C2664: 'GetPrivateProfileSectionA' : cannot convert parameter 2 from 'CString' to 'LPSTR'
            No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    


  • Versuch's mal mit CString.GetBuffer().



  • crasy schrieb:

    Erstmal danke für die hielfe aber da gibt es imme rnoch ein Problem 😞

    @Chris++
    Wenn ich deinen Code für die Länge des Char-Felds einarbeite schreibt der mir einen Fehler am anfang!!!

    Fehler:
    "eine unbenannte Datei wurde nicht gefunden"

    Das Programm arbeitet zwar aber die Informationen werde nicht aus der Datei gelesen.

    Wenn dieser Fehler kommt, heist das, das der Pfad zur Datei (CString Pfad = ...) nicht stimmt oder das es diese Datei gar nicht gibt. Prüfe mal ob du die Datei auch wirklich angelegt hast oder ob du die Variable Pfad nur falsch initialisierst (haltepunkt mit F9 auf die Zeile in der die Variable steht, dann mit F5 Debugmodus starter + 1x F10 um einen Schritt weiter zu springen; Dann doppelklick auf die Variable Pfad und voila, im Quickinfo wird deren Inhalt angezeigt).



  • Ok hab ich gemacht ...
    Datei ist da.... aber wenn ich im Debug schaue steht bei der Variable Pfad das da

    " Ȇ5 "

    Das kann doch nihct richtig sein oder ?! und wenn nicht was hab ich dann falsch gemacht???

    hier noch mal der Code wie er jetzt aussieht!!!

    void CAdFFDlg::IniSections(CString section,CString filename,CString direktory)
    {
    	if (direktory == "")
        {
            char *direkt = new char[500];
            int laenge = GetCurrentDirectory(499,direkt);
            direkt[laenge] = NULL;
            direktory.Format("%s",direkt);
            delete []direkt;
        }
    
    	CString Pfad = direktory + "\\" + filename + ".ini"; 
    	CFile   Datei;
    
    	if(Datei.Open(Pfad, CFile::modeRead))     //Datei öffnen
    	{
    		char* pBuf = new char[Datei.GetLength() + 1];
    		pBuf[Datei.GetLength()] = '\0';
    
    		Datei.Close();
    
    		GetPrivateProfileSection(section	,	pBuf	,	Datei.GetLength() + 1	,	Pfad);
    		//...
    		int h_pos = 0,
    			h_p = 0,
    			h_pos_gleich,
    			i = 0;
    
    		CString returnstring,ausgabe;
    
    		returnstring.Format("%s",pBuf);
    
    		while(!returnstring.IsEmpty())
    		{
    			returnstring.Format("%s",&pBuf[h_p]);
    			h_pos = returnstring.Find('\0');
    
    			ausgabe = returnstring;
    			h_pos_gleich = ausgabe.Find('=');
    
    			ausgabe = ausgabe.Left(h_pos_gleich);
    			if(returnstring != "")
    			{
    				m_clb_user_liste.AddString(ausgabe);
    			}
    			UpdateData(FALSE);
    			h_p += h_pos +1;
    		}
    	}
    //...
    	delete []pBuf;
    }
    

Anmelden zum Antworten