ostringstream string ach was weiß ich!
-
hallo Guys! schon wieder ich.
ich habe folgenden Code. Weiß jemand warum die Länge von rbcd.str() ist 0 bei Microsoft Visual C++ 6?? (Total unangenhem
)
Bei g++ ist es 1#include <iostream> #include <sstream> using namespace std; typedef unsigned char uchar; int main() { ostringstream bcd, rbcd; bcd << (uchar)0x00; cout << bcd.str().size() << endl; /* Size of bcd.str() is 1 ok! */ rbcd << bcd.str(); cout << rbcd.str().size() << endl;/* Size of rbcd.str() is 0 under MSVC whyyyy!!!!!! */ return 0; }
Ich bedanke mich für Eure Kommentare.
-
0x00 (oder auch '\0') ist Stringende-Zeichen. Und wenn das alleine in einem String steht, könnte der Operator<< das als leeren String interpretieren (und deshalb 0 Zeichen senden), hängt ganz davon ab, ob er die tatsächliche Länge des Strings aus dessen Membern holt oder mit strlen().
-
Das komisches ist aber, daß es bei g++ geht.
Kennt jemand ein Workaround pleeeeease?
-
Die Fehlfunktion liegt in
rbcd << bcd.str();
In der mitgelieferten H-Datei <string> des MS VC6 ist die Ausgabe eines std::string's so codiert:
template<class _E, class _Tr, class _A> inline basic_ostream<_E, _Tr>& __cdecl operator<<( basic_ostream<_E, _Tr>& _O, const basic_string<_E, _Tr, _A>& _X) { _O << _X.c_str(); // <- hier wird nur bis exklusiv der nächsten '\0' ausgegeben return (_O); }
Ein einfacher Workaround wäre es, einfach den internen Streambuf des stringstreams auszugeben. Dazu muss die Variable 'bcd' ein std::stringstream sein. Das ganze sieht etwa so aus:
#include <iostream> #include <sstream> using namespace std; typedef unsigned char uchar; int main() { ostringstream rbcd; stringstream bcd; // bcd mit in/out-Fähigkeit bcd << (uchar)0x00; cout << bcd.str().size() << endl; /* Size of bcd.str() is 1 ok! */ rbcd << bcd.rdbuf(); // einfach den Inhalt des internen Streambuf auskippen cout << rbcd.str().size() << endl; // Size sollte auch unter MSVC6 ==1 sein return 0; }
Gruß
Werner