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


Anmelden zum Antworten