Problem mit: stringstream.str( String )
-
Hi,
ich moechte eine formatierte eingabe mit den stringstream realisieren.
Jetzt hab ich folgenden Fall:
void Request::DataAsString( tstringstream& ss,const DataMap& Map) const { DataMap::const_iterator iter = Map.begin(); TCHAR AssigmentChar = _T('='); TCHAR DelimiterChar = _T('&'); for( ; iter != Map.end(); iter++) { #ifdef UNICODE std::wstring Name = ConvertStr( url::Encode( iter->first) ); std::wstring Value = ConvertStr( url::Encode( iter->second) ); #else std::string Name = URLEncode( iter->first) ; std::string Value = URLEncode( iter->second) ; #endif ss << Name << AssigmentChar << Value << DelimiterChar; } tstring Tmp = ss.str(); Tmp = Tmp.substr(0, Tmp.length()-1); ss.str( Tmp ); }Da ja jetzt am ende ein Delimiter zu viel da ist hab ich mir gedacht ich hol mir das String Object aus dem ss, entferne das letzte Zeichen und setzte es wieder mit: ss.str( Tmp );
Das Problem dabei ist jetzt, wenn ich erneute eine Eingabe mit: ss << .. versuche faengt er wieder am Anfang an einzufuegen.
Bspl:
DataAsString( ss, DataMap); /* aktuell in ss: "?test=1&id=6" */ ss << _T(" "); /* jetzt in ss: " test=1&id=6*/Aber ich moechte ja weiter am Ende einfuegen
Muss ich jetzt jedes mal:
ss.seekp( std::io_base::end);nach einem ss.str( Stirng) aufrufen?
Greetz
-
Prüf´ doch einfach im Schleifenrumpf, ob iter == begin() ist, wenn ja fügst du kein Trennzeichen ein, wenn doch fügst du eins ein. Allerdings gestaltet sich die Logig dabei etwas anders, du schreibst das Trennzeichen nicht nach einer Zeile, sondern davor.
void Request::DataAsString( tstringstream& ss,const DataMap& Map) const { TCHAR AssigmentChar = _T('='); TCHAR DelimiterChar = _T('&'); for( DataMap::const_iterator iter = Map.begin(); iter != Map.end(); iter++) { #ifdef UNICODE std::wstring Name = ConvertStr( url::Encode( iter->first) ); std::wstring Value = ConvertStr( url::Encode( iter->second) ); #else std::string Name = URLEncode( iter->first) ; std::string Value = URLEncode( iter->second) ; #endif if( iter != Map.begin() ) { // es steht bereits mind. ein Element im Strom, vor dem Schreiben // des nächsten Elements muss also das Trennzeichen geschrieben werden ss << DelimiterChar; } // Element schreiben ss << Name << AssigmentChar; } }
-
Hmm genau da bin ich jetzt im ersten Moment gar ned drauf kommen. Hab das jettz au so gemacht.
Jetzt waere aber noch die Frage ob dieses Verhalten des stringstreams so gewollt ist?
Greetz