ostream in char umleiten



  • Hallo,

    ich habe eine Klasse, die mittels

    std::ostream& operator<<(std::ostream& os, Klasse& k)
    {
        os << k.info();
        return os;
    };
    
    class Klasse
    {
      friend std::ostream& operator<<(std::ostream& os, Klasse& k);
    };
    

    Statusinformationen in ein ostream-Objekt ausgeben kann, Nun würde ich gerne diese Ausgabe in einen char umleiten. Dazu suche irgendetwas in der Art von

    Klasse k;
    char buf[256];
    buf << k;
    

    Kann man das irgendwie realisieren? Kenne mich leider mit diesen ostreams nicht besonders aus und wäre Dankbar für jede Form der Hilfe.



  • Schau dir doch mal die stringstream's an, die kannst du dafür verwenden (wobei mir persönlich std::string besser gefallen als char[].



  • hi,

    was möchtest du damit bezwecken?
    Kommt immer ganz drauf an, ob das überhaupt sinnvoll ist.
    Kannst ja vielleicht mal kurz den Zweck erläutern...

    hier mal was zu Streams...

    http://cplus.kompf.de/artikel/stream1.html

    wenn du das Problem näher beschreibst, kann ich dir bestimmt helfen

    grüße



  • was möchtest du damit bezwecken?

    Ich habe eine Funktion, die als Eingabe einen Parameter vom Typ const char* erwartet. Dieser Funktion würde ich nun gerne die Ausgabe der o.g. Klasse übergeben. Ich könnte mir die Zeichenkette, die der Ausgabeoperator liefert, auch mit sprintf selbst zusammenbasteln und der Funktion übergeben, aber eigentlich würde ich damit die selbe Arbeit zwei mal verrichten.



  • Möglichkeit 1 wäre es ja, direkt k.info() an deine Methode weiterzureichen (zur Not auch k.info().c_str()).

    Etwas komplizierter ist die folgende Lösung (wenn du einen aufwendigeren operator<< hast):

    Klasse k;
    std::stringstream sin;
    sin<<k;
    func(sin.str().c_str());// func() ist deine Funktion, an die du einen const char* weiterreichen willst
    


  • #include <strstream>
    
    // ...
    
    char buf[256];
    std::ostrstream os (buf, 256);
    os << k;
    


  • Vielen Dank, CStoll, Möglichkeit 2 funktioniert like a charme!!! Danke aber auch an alle anderen, habt mir ne Menge Arbeit abgenommen 😉



  • CStoll (off) schrieb:

    func(sin.str().c_str());// func() ist deine Funktion, an die du einen const char* weiterreichen willst
    

    Ist das legal? Ist der temporäre String, der durch den Aufruf von str() konstruiert wird, nicht schon wieder zerstört, wenn man den char*-Zeiger von c_str() an die Funktion weitergibt?

    @.filmor : ostrstream ist deprecated 🙂



  • Soweit ich das gelernt habe, überleben temporäre Objekte bis zum Ende des Ausdruckes, in dem sie erstellt wurden - dieses also bis zum Rücksprung aus func(). (aber du kannst mich gerne berichtigen, wenn du magst)



  • Sorry, ich dachte, dass sei die Stringstream-Version für char-Arrays (nicht dass ich sowas verwenden würde :)). Wo steht denn, dass c_str() einen temporären String zurückliefert?
    BTW, bei ifstream-Konstruktoren macht man üblicherweise auch nichts anderes (und das funktioniert mit Sicherheit)!



  • .filmor schrieb:

    Wo steht denn, dass c_str() einen temporären String zurückliefert?

    Nicht c_str(). stringstream.str() liefert einen std::string zurück (keine Referenz sondern ein reales Objekt). Wenn man auf diesem temporären Objekt nun c_str() aufruft und danach der string sterben würde, so hätte man einen Zeiger auf bereits freigegebenen Speicher.

    Ich bin mir aber auch nicht 100% sicher, ob der String tatsächlich zerstört wird oder ob das erst nach Beendigung des Funktionsaufrufes passiert. Mein Verdacht kommt daher, weil er am Aufruf von func() selbst nicht (direkt) beteiligt ist. Ob das tatsächlich so ist, kann ich auch nicht garantieren, sondern müsste erst den Standard befragen.

    Die strstream-Klassen sind in der Tat für char* gedacht, werden im Standard allerdings nur im Annex D unter Compatibility Features [depr.str.strstreams] erwähnt.

    Nachtrag:

    Ich habe mal im Standard gewühlt dazu.

    func(sin.str().c_str()); sollte demnach eine full-expression (1.9) sein (und sin.str().c_str() nur eine sub-expression). Wird in deren Kontext ein temporäres Objekt erzeugt (12.2), so wird es erst zerstört, nachdem die Auswertung der full-expression vollständig abgearbeitet ist. Demnach sollte die Zeile wohl gültig sein.


Anmelden zum Antworten