Wozu Stringstreams?



  • Grüße Euch C++-Menschen,

    Ich befasse mich ne weile mit C++, und habe aktuell die Libs <string>, <iostream>, <fstream>, <sstream> kennengelernt.

    Ich versteh nicht ganz, wozu man die Stringstreams überhaupt braucht.

    Kennt sich da jemand aus? 🙂

    😮 tut mir Leid, hab dies im falschen Board veröffentlicht...



  • die braucht man um in strings zu schreiben oder zulesen. das kann man aber auch googlen



  • Man kann damit gut konvertieren, z.B. ints oder doubles zu strings und vice versa:

    std::stringstream ss;
    ss << "123456";
    int a;
    ss >> a;
    if ( ! ss )
        ; // Fehler
    

    Das kann man zwar weitgehend durch boost::lexical_cast ablösen:

    #include <boost/lexical_cast.hpp>
    
    int a = boost::lexical_cast<int>( "123456" );
    

    Aber soweit ich weiß, kann boost::lexical_cast z.B. nicht hexadezimale Zahlen umwandeln, geht also nur mit std::stringstream:

    std::stringstream ss;
    ss << "FFFF";
    int a;
    ss >> std::hex >> a; // Gibt 65535 aus
    

    Zudem kann man mit stringstream gut Zeichenketten zusammenbasteln:

    std::stringstream ss;
    ss << "Hallo " << 1234 << ", " << 123.4 << " blubb";
    std::string a = ss.str();
    

    , was wiederum aber auch ohne stringstream geht:

    using std::string;
    using boost::lexical_cast;
    string a = string("Hallo ") + lexical_cast<string>(1234) + ", " + lexical_cast<string>(123.4) + " blubb";
    


  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Badestrand schrieb:

    [...], was wiederum aber auch ohne stringstream geht:

    using std::string;
    using boost::lexical_cast;
    string a = string("Hallo ") + lexical_cast<string>(1234) + ", " + lexical_cast<string>(123.4) + " blubb";
    

    Aber gerade sowas, vor allem wenn es häufig passiert, sollte man mit stringstreams umsetzen.


  • Administrator

    Badestrand schrieb:

    ..., was wiederum aber auch ohne stringstream geht:

    using std::string;
    using boost::lexical_cast;
    string a = string("Hallo ") + lexical_cast<string>(1234) + ", " + lexical_cast<string>(123.4) + " blubb";
    

    Dir ist bewusst, dass boost::lexical_cast intern einen std::stringstream verwendet? 😃
    Deshalb kann man zum Beispiel auch sowas machen:

    template<typename ValueT>
    struct Hex
    {
      ValueT value;
    
      Hex()
        : value()
      { }
    
      Hex(ValueT const& value)
        : value(value)
      { }
    };
    
    template<typename ValueT>
    std::ostream& operator <<(std::ostream& output, Hex<ValueT> const& hex)
    {
      return output << std::hex << hex.value;
    }
    
    template<typename ValueT>
    std::istream& operator >>(std::istream& input, Hex<ValueT>& hex)
    {
      return input >> std::hex >> hex.value;
    }
    
    int main()
    {
      int i = boost::lexical_cast<Hex<int> >("AF").value;
    
      return 0;
    }
    

    Grüssli



  • Dravere schrieb:

    Dir ist bewusst, dass boost::lexical_cast intern einen std::stringstream verwendet? 😃

    Ich hatte es vermutet, weil <boost/lexical_cast.hpp> erfahrungsgemäß die <sstream> mit einbindet - nachgeschaut hab ich aber nie 🙂

    Interessante Lösung mit Hex<int>.



  • :D, danke Leute... 🙂

    ich wünschte mir, dass der Buchautor manche Themen auch so praktisch und verständlich erklären würde.


Anmelden zum Antworten