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.
-
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 einenstd::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 einenstd::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.