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


Anmelden zum Antworten