CString "addition"?



  • hm, stimmt geht bei mir auch.
    Aber ich füll test ja auch mti einem Cstring der ja mit cout korrekt ausgegeben wird.
    Ich hol mir den CSTring mit

    test = FileTotal.getIniWert("Pfadangaben", "EingabeDateien");
    

    die funktion ist so definiert:

    CString getIniWert (CString section, CString key);
    

    warum geht das denn so nicht?!



  • Zeig doch bitte mal ein wenig mehr Code, nach Möglichkeit ein kompilierbares Minimalbeispiel, das den Fehler reproduziert. Wenn du hier nur häppchenweise Code ablieferst, kommen wir auf keinen grünen Zweig.



  • hmm.. also wenn ichs jetzt mal halbwegs so posten soll wie es bei mir läuft... im Prinzip müsste man dann noch eine dll erstellen die dann die Klasse freigibt.
    Müsste quasi so aussehen, wenn nur die benutzten Funktionen eingegliedert werden:

    header dll:

    #include "stdafx.h"
    
    using namespace std;
    
    class AFX_EXT_CLASS FileIO{
    public:
    	FileIO();
    	~FileIO();
             //Setzt den Pfad der IniDatei
    	setIniPfad (CString path);
    	CString getIniWert (CString section, CString key);
    private:
    	CFile cf;	//Dateiobjekt
    	CString cstIniPath;
    };
    

    cpp dll:

    #include "IOFileText.h"
    int FileIO::setIniPfad (CString path){
    	 cstIniPath = path;
    	 return 1;
    }
    
    CString FileIO::getIniWert (CString section, CString key){
    	long lngResult = 0;
    	CString Cstbuffer("");
    
    	if (iniPath.GetLength())
    		lngResult = GetPrivateProfileString ((LPCSTR) section, (LPCSTR) key, "", Cstbuffer.GetBuffer(255) , 255, (LPCSTR) cstIniPath);
    
    	if (lngResult)                   
            return Cstbuffer.Left(lngResult);
    	else 
    		return "";
    }
    

    so... und aufgerufen wird das dann bisher folgendermaßen(der vollständigkeithalber):

    header auszug:

    #include "IOFileText.h"
    
    FileIO FileTotal;
    int initFile();
    

    cpp auszug:

    int initFile(){
    	CString test, test2, test3;
    
    	FileTotal.setIniPfad("C:\\infotool.ini");
    	test = FileTotal.getIniWert("Pfadangaben", "EingabeDateien");
    	cout <<	(LPCTSTR) test <<"\n";	//ergibt "c:\" (richtig)
    	test2 = "test.txt";
        cout <<	(LPCTSTR) test2;	   //ergibt "test.txt" (richtig)
    	test3 = test + test2;          
    	cout <<	(LPCTSTR) test3;      //ergibt "test.txt" (falsch)
    	return 1;
    }
    

    und die initFile wird eben ganz normal über die main Methode aufgerufen.
    Denke das ist nun vollständig 😉 .

    Gruß



  • Die MSDN Library sagt:
    If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CSimpleStringT member methods.

    Mach das bitte mal.



  • Besten Dank, funktioniert. 👍
    Glaub da wär ich nie drauf gekommen 😃
    <hat ja schließlich augenscheinlich das Richtige gemacht>

    Nochmal Danke 🙂 .

    Gruß



  • warum so?

    test2 = test + CString("test.txt");
    

    und nicht so?

    test2 = test + "test.txt";
    

    Ist das erste "standard"komformer? sicherer?



  • "test.txt" ist nur ein char-Feld. Da man aber zwei CStrings addieren soll/will/muss, nimmt man CString("test.txt"), denn so wird das char-Feld in einen CString konvertiert, was korrekter und sicherer ist, da der +Operator der Klasse CString eigentlich für zwei Cstrings gemacht wurde, und nicht für einen CString und ein char-Feld.



  • Also im Prinzip spricht da nichts gegen. Der + Operator akzeptiert auch const char als zweiten Parameter (nicht als ersten wenn ich das richtig gesehen habe). Ich habe den cast nur gemacht, weil ich rumprobiert habe und das eben einer der Versuche war ;-).

    Gruß



  • Ich sags mal so.
    bis jetzt hat er nie gemeckert und ein + "blablabla" immer genommen.

    Mal im ernst. Kann es da einmal schwierigkeiten geben?

    Zudem dauert doch noch n cast länger als "direkt" das char Feld zu übergeben, oder?



  • hi,
    ich denke nicht das es da zu Problemen führen könnte. mit dem Cast magst du auch recht haben, wobei es durchaus sein könnte das er das intern sowieso wieder castet, weiß ich nun aber nicht.
    Ich benutz das zumindest auch nie, aber vielleicht weiß jemand ob der das innerhalb des überladenen Operators castet?!

    Gruß


Anmelden zum Antworten