komische array ausgabe



  • Hi,

    hab mich lange zeit um arrays gedrückt:)

    ich hab mir ne klasse geschrieben, die pfade anlegen soll, dateien schreiben
    etc.

    für den pfadnamen hab ich ein char array

    private:
    char m_szPathname[32];
    

    und eine methode zum pfad erstellen

    char DbClass::CreatePath(char path[])
    {	
    	ostringstream buffer;
    	string pfad;
    	string pfad_prefix="C:\\";
    	buffer << path;
    	pfad=buffer.str();
    	pfad=pfad_prefix+pfad;
    	m_szPathname==pfad;
    	cout<<pfad<<endl; //das gibt er korrect aus mit C:\pfadname
    	CreateDirectory(pfad.c_str(),NULL);
    
    	return m_szPathname[32];
    }
    

    komische ist wenn ich der membervariablen nix zuweise und einfach so
    übergebe steht der pfad trozdem drin.

    problem ist, er füllt das array mit ascii zeichen, die bei der ausgabe
    nerven, und den prefix lässt er völlig weg.

    und eine funktion kann wohl auch kein array zurückgeben?
    hatte die funktion um geschrieben und dann kam als error,
    funktion gibt ein array zurück.

    das programm macht ja so was es soll, nur die ausgabe ist etwas komisch.

    hab jetzt schon etliche stunden rumprobiert und komme auf keine lösung,
    wie ich die ascii-zeichen aus dem array rausbekomme.

    Vielen dank schonmal an Euch



  • Hi!

    m_szPathname==pfad;
    

    Das ist keine Zuweisung, nicht?
    Nutz doch für m_szPathname auch einfach ein std::string, wär die schönere Lösung.

    grüße



  • oder boost::filesystem::path

    Greetz, Swordfish



  • jop "==" ist ne typkovertierung, hatte auch zuweisung schon probiert,
    aber dann meckert er wegen char to char[].

    include sachen hat er in der klasse nicht angenommen, wenn
    ich dem gesagt habe "string variable", hat er gemeckert weil
    er string nicht kennt, oder muss ich bei header dateien was anderes nehmen
    als include?

    meine klassen sind immer gleich gebaut

    #ifndef _XXX_H
    #define _XXX_H
    
    class xxx
    {
    private:
    
    public:
    };
    
    #endif
    


  • Hallo

    #ifndef _XXX_H
    #define _XXX_H
    #include <string>
    
    class xxx
    {
    private:
      std::string iString;
    
    public:
    };
    
    #endif
    

    Um die C-Strings (also char* und char[]) zu kopieren brauchst du die Funktion strncpy. Wenn der Zielstring vom Typ std::string ist, reicht eine Zuweisung.

    bis bald
    akari



  • adonis schrieb:

    char DbClass::CreatePath(char path[])
    {   
        ostringstream buffer;
        string pfad;
        string pfad_prefix="C:\\";
        buffer << path;  // wieso schiebst du path in einen stringstream?
    
        pfad = buffer.str();
        pfad = pfad_prefix + pfad;
    
        m_szPathname==pfad; // !?
    
        cout << pfad << endl;
        CreateDirectory( pfad.c_str(), NULL );
    
        return m_szPathname[ 32 ]; // du gibst ein Zeichen zurück, das dir nicht gehört.
    }
    

    adonis schrieb:

    jop "==" ist ne typkovertierung, hatte auch zuweisung schon probiert, [...]

    Quatsch mit Soße! == ist der Vergleichsoperator.

    so zB:

    #ifndef _DBCLASS_H
    #define _DBCLASS_H _DBCLASS_H
    
    #include <cstring>
    #include <iostream>
    
    #include <windows.h>
    
    using namespace std;
    
    class DbClass {
    
        private:
    
            char m_szPathname[ 32 ]; // hm, wie lange werden 31 Zeichen wohl reichen!?
                                     // he, das reimt sich sogar... ;)
    
        public:
    
            char *CreatePath( char *path );
    };
    
    char* DbClass::CreatePath( char *path )
    {
        m_szPathname[ 0 ] = '\0';
        strcpy( m_szPathname, "C:\\" );
        strcat( m_szPathname, path );
        cout << m_szPathname << endl;
        CreateDirectory( m_szPathname, 0 );
        return m_szPathname;
    }
    
    #endif /* _DBCLASS_H */
    

    aber std::string wär besser:

    #ifndef _DBCLASS_H
    #define _DBCLASS_H _DBCLASS_H
    
    #include <cstring>
    #include <iostream>
    
    #include <windows.h>
    
    using namespace std;
    
    class DbClass {
    
        private:
    
            string m_pathname;
    
        public:
    
            void CreatePath( char *path );
    };
    
    void DbClass::CreatePath( char *path )
    {
        m_pathname = "C:\\";
        m_pathname += path;
        cout << m_pathname << endl;
        CreateDirectory( m_pathname.c_str( ), 0 );
    }
    
    #endif /* _DBCLASS_H */
    

    Greetz, Swordfish


Log in to reply