<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[std::istringstream Buffer Injection?]]></title><description><![CDATA[<p>Hoi! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich habe einen std::string, den ich gerne mit einem std::istringstream parsen würde.</p>
<p>Die normale Technik wäre es wohl, den Stream einfach über den Konstruktor zu initialisieren, hierbei fällt aber der Overhead von Speicherallozierung und das Kopieren des kompletten Strings an.</p>
<p>Wäre es nicht möglich, den std::string direkt in den Streambuffer zu injecten, so dass dieser direkt genutzt wird? Oder wäre es alternativ möglich, den Umweg über den string komplett wegzulassen und direkt in den Buffer des stringstreams zu schreiben?</p>
<p>Danke schon mal.<br />
Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291582/std-istringstream-buffer-injection</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 13:03:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291582.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Aug 2011 09:08:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::istringstream Buffer Injection? on Mon, 22 Aug 2011 09:08:16 GMT]]></title><description><![CDATA[<p>Hoi! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich habe einen std::string, den ich gerne mit einem std::istringstream parsen würde.</p>
<p>Die normale Technik wäre es wohl, den Stream einfach über den Konstruktor zu initialisieren, hierbei fällt aber der Overhead von Speicherallozierung und das Kopieren des kompletten Strings an.</p>
<p>Wäre es nicht möglich, den std::string direkt in den Streambuffer zu injecten, so dass dieser direkt genutzt wird? Oder wäre es alternativ möglich, den Umweg über den string komplett wegzulassen und direkt in den Buffer des stringstreams zu schreiben?</p>
<p>Danke schon mal.<br />
Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108988</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 22 Aug 2011 09:08:16 GMT</pubDate></item><item><title><![CDATA[Reply to std::istringstream Buffer Injection? on Mon, 22 Aug 2011 09:18:07 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>hast du schon mal ein Beispiel kompeliert und angeschaut was der Compiler tatsächlich macht?<br />
Und wenn es dir nicht gefällt, dann aktiviere doch mal C++0x.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2108995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2108995</guid><dc:creator><![CDATA[Siassei - Auf der Arbeit]]></dc:creator><pubDate>Mon, 22 Aug 2011 09:18:07 GMT</pubDate></item><item><title><![CDATA[Reply to std::istringstream Buffer Injection? on Mon, 22 Aug 2011 09:29:15 GMT]]></title><description><![CDATA[<p>Wenn du ganz ganz dolle versprichst, dass der String länger lebt als der Streambuf, dann kann man sich selber einen Streambuf schreiben, der nur eine Referenz und keine Kopie nimmt:</p>
<pre><code class="language-cpp">#include &lt;streambuf&gt;
#include &lt;istream&gt;    
#include &lt;string&gt;

#include &lt;iostream&gt;

class string_buf : public std::streambuf
{
public:
  string_buf(std::string &amp;str):
    str(str)
  , index(0)
  { }

protected:
  virtual int_type underflow() 
  {
    if (index &lt; str.length())
      return (traits_type::to_int_type(str[index]));  
    else
      return traits_type::eof();
  }
  virtual int_type uflow()      
  {
    if (index &lt; str.length())
      return (traits_type::to_int_type(str[index++]));  
    else
      return traits_type::eof();
  }
private:
  string_buf( const string_buf&amp; );
  string_buf&amp; operator=( const string_buf&amp; );

  const std::string &amp;str;
  std::size_t index;
};

int main()
{
   std::string content = &quot;Hallo Welt!\n99 Flaschen hängen an der Wand.\nDies ist ein toller Taschenrechner\nUnd 'tschüss.&quot;;
   string_buf foo(content);
   std::istream ifs(&amp;foo);

  int i=0;
  std::string out;
  while(getline(ifs,out)) std::cout &lt;&lt; &quot;Zeile &quot; &lt;&lt; i++ &lt;&lt; &quot;: &quot; &lt;&lt; out &lt;&lt;'\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2109006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109006</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 22 Aug 2011 09:29:15 GMT</pubDate></item><item><title><![CDATA[Reply to std::istringstream Buffer Injection? on Mon, 22 Aug 2011 10:38:25 GMT]]></title><description><![CDATA[<p>Genau das hab ich gesucht, danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109046</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 22 Aug 2011 10:38:25 GMT</pubDate></item><item><title><![CDATA[Reply to std::istringstream Buffer Injection? on Tue, 23 Aug 2011 20:25:06 GMT]]></title><description><![CDATA[<p>Eine Frage, die mich beschäftigt ...</p>
<p>Ich habe mir den Buffer jetzt so gebaut:</p>
<pre><code class="language-cpp">template&lt;typename Char&gt;
    class ReferencingStringBuffer : public std::streambuf
    {
    private:
      Char const* m_string;

    public:
      ReferencingStringBuffer(Char const* string)
        : m_string(string)
      { }

    protected:
      virtual int_type underflow()
      {
        if(*m_string)
          return traits_type::to_int_type(*m_string);
        else
          return traits_type::eof();
      }

      virtual int_type uflow()
      {
        if(*m_string)
          return traits_type::to_int_type(*m_string++);
        else
          return traits_type::eof();
      } 
    };
</code></pre>
<p>Wieso verbietest du das Kopieren deines Streambuffers?<br />
Gibt es noch weitere Gründe gegen das Kopieren außer der Tatsache, dass sich mehrere Streams einen Buffer teilen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109818</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Tue, 23 Aug 2011 20:25:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::istringstream Buffer Injection? on Tue, 23 Aug 2011 23:04:51 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Wieso verbietest du das Kopieren deines Streambuffers?</p>
</blockquote>
<p>Dafür gibt's hier keinen Grund mehr. Ich habe mit dem Code meines Standardbuffers angefangen und den an das Problem angepasst. Bei dem macht das auch Sinn, dass er nicht kopierbar ist. Und hier habe ich einfach vergessen, das rauszumachen. Ich sehe keinen Grund, warum dieser Buffer nicht kopiert werden sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2109891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2109891</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 23 Aug 2011 23:04:51 GMT</pubDate></item></channel></rss>