Typenumwandlungsproblem!



  • Wie kann ich den Inhalt von diesen Variablentyp:

    char var1[100]

    in diesen hineinschreiben:

    char* var2;

    ich hab es schon mit Stringsteams probiert, das klappt aber nicht:

    #include <sstream>
    stringstream sstr;
    char var1[100];
    char* var2;
    
    sstr << var1;
    sstr >> var2;
    

    Gruß skontox



  • Warum willst du das tun?



  • wenn ich das richtig verstanden habe was du willst, sollte das so gehen:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int i;
    
    	char var1[100];
    
    	for (i=0; i<100; ++i){
    		var1[i]='y';
    		cout<<var1[i]<<endl;
    	}
    
    	cout<<"Jetzt var2:"<<endl;
    
    	char* var2= new char[100];
    
    	for (i=0; i<100; ++i){
    		var2[i]=var1[i];
    		cout<<var2[i]<<endl;
    	}
    	return 0;
    }
    


  • zu Bashar:

    Weil meine Funktion ein "char*" zurückliefern muß!

    Diese Funktion liefert mir eine private membervariable zurück in der der Inhalt einer Datei stehen soll.

    Ich hab den Inhalt allerdings in einer Variable vom Typ char [100] eingelesen.

    Und nun muß ich von char [100] in char* konvertieren.

    Leider kann ich die Variablen nicht einfach zuweisen, da das Programm dann abbricht.

    Gruß skontox



  • Na wenn das so ist:

    class X {
      private:
        char buffer[100];
      public:
        void read_from_file(FILE* f);
        char * get_buffer();
    };
    
    char * X::get_buffer()
    {
      return buffer;
    }
    

    Entspricht das in etwa deinem Setup? Sollte so zunächst keine Schwierigkeiten machen. Jedenfalls ist das keine Frage der Typumwandlung, sondern der Lebenszeit des Buffers. Statisch, dynamisch oder automatisch?



  • Ich hab Deins aber noch nicht berücktsichtig, da Du schneller warst als ich (bashar)! Schau ich mir sofort an! Herzlichen Dank erstmal!

    Ich glaube ich hab mich schlecht ausgedrückt:

    Also nochmal:

    class File
    {
         public:
            // construtor
            File();
    
            // destructor
            ~File();
    
            // method for opening the configuration-file ("config")
            char* OpenConfig();
    
            // method which returns the content of the configuration-file ("config")
            char* GetContent();
         private:
            char* content; //contains the data from config file
    }
    
    char* File::OpenConfig()
    {
        ifstream file("config"); // File "config"
        char buf[100];
        char* error;
        ...
    
        while(!file.eof())
        {
               file.read(buf, sizeof(buf)-1);
               read=file.gcount();
        }
       this->content=buf; // <---das klappt leider nicht!!! Aber wie sonst???
       return error;
    }
    
    char* File::GetContent()
    {
        return this->content; //returns private membervariable
    }
    

    Gruß skontox



  • Dir auch besten Dank "fluffy"!

    Gruß skontox



  • zu Bashar:

    Deine Lösung war anfangs auch meine, aber das Programm bricht dann immer mit Signal 11 ab. So ein Mist!

    Gruß skontox



  • Aber nicht vergessen, den Speicher nachher wieder freizugeben, sonst kriegst du Speicherlöcher. In C++ würdest du für sowas wahrscheinlich eher mit std::string arbeiten, also:

    #include <string>
    
    std::string get_some_string() {
      std::string s = "Hello, World!";
      return s;
    }
    

    in C würdest du einen Buffer und seine Länge übergeben:

    char *get_some_string(char *buf, size_t buflen) {
      /* ...hier den String in buf einlesen, aber nicht mehr als buflen - 1 Zeichen */
      return buf;
    }
    

    ..und es dann nachher so aufrufen:

    char s[100];
    puts(get_some_string(buf, 100));
    

    Die Idee dahinter ist, Speicherlöcher und Buffer Overflows zu vermeiden. fgets macht es zum Beispiel genauso.



  • Besten Dank erstmal!
    Ich werde mir das jetzt mal genau anschauen, ob ich das vielleicht für mein Programm verwerten kann!

    Gruß skontox


Anmelden zum Antworten