<?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[Teil eines streams kopieren]]></title><description><![CDATA[<p>Hi,<br />
ich hab einen istream und möchte daraus einen Ausschnitt in einen ostream kopieren. Bislang mache ich das indem ich einen extra buffer erzeuge, dort die Daten per seekg und read reinlese und dann den buffer in den ostream schreibe.</p>
<p>Ich dachte mir aber, das muss doch eleganter gehen. Gefunden habe ich die copy-function aus &lt;algorithm&gt;. Leider wird überall immer nur beschrieben wie man damit den ganzen stream kopiert:</p>
<pre><code>std::stringstream src( std::ios_base::binary );
  src.str(&quot;hello world&quot;);
  std::stringstream dest( std::ios_base::binary );

  std::copy( std::istream_iterator&lt;char&gt;(src),
             std::istream_iterator&lt;char&gt;(),
             std::ostream_iterator&lt;char&gt;(dest) );
</code></pre>
<p>Wie stelle ich es an, dass nur ein Teil des streams kopiert wird? z.B. die zeichen 4-8? Geht das überhaupt mit copy?</p>
<p>gruß,<br />
eXi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277782/teil-eines-streams-kopieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 18:12:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277782.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Nov 2010 12:34:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Teil eines streams kopieren on Wed, 24 Nov 2010 12:34:57 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich hab einen istream und möchte daraus einen Ausschnitt in einen ostream kopieren. Bislang mache ich das indem ich einen extra buffer erzeuge, dort die Daten per seekg und read reinlese und dann den buffer in den ostream schreibe.</p>
<p>Ich dachte mir aber, das muss doch eleganter gehen. Gefunden habe ich die copy-function aus &lt;algorithm&gt;. Leider wird überall immer nur beschrieben wie man damit den ganzen stream kopiert:</p>
<pre><code>std::stringstream src( std::ios_base::binary );
  src.str(&quot;hello world&quot;);
  std::stringstream dest( std::ios_base::binary );

  std::copy( std::istream_iterator&lt;char&gt;(src),
             std::istream_iterator&lt;char&gt;(),
             std::ostream_iterator&lt;char&gt;(dest) );
</code></pre>
<p>Wie stelle ich es an, dass nur ein Teil des streams kopiert wird? z.B. die zeichen 4-8? Geht das überhaupt mit copy?</p>
<p>gruß,<br />
eXi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985094</guid><dc:creator><![CDATA[eXistence]]></dc:creator><pubDate>Wed, 24 Nov 2010 12:34:57 GMT</pubDate></item><item><title><![CDATA[Reply to Teil eines streams kopieren on Wed, 24 Nov 2010 13:49:08 GMT]]></title><description><![CDATA[<p>Das erste Argument von copy stellt den Anfang und das zweite das Ende des zu kopierenden Bereichs dar.<br />
<code>std::istream_iterator&lt;char&gt;(src)</code> ist der Anfang vom Stream und <code>std::istream_iterator&lt;char&gt;()</code> ist das Ende.<br />
Um die Zeichen 4-8 zu kopieren bräuchtest du ein Iterator auf das Zeichen 4 und einen hinter das Zeichen 8. Während das erste kein Problem ist, wird das zweite schon schwieriger. Hilfreicher wäre ein <code>copy_n</code> ((noch) nicht STL). Kannst du als einfache Schleife schreiben.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

int main()
{
    using namespace std;   
    istream_iterator&lt;char&gt; in(cin);
    ostream_iterator&lt;char&gt; out(cout, &quot;\t&quot;);

    advance(in, 3);
    for(int i = 0; i &lt; 4; ++i)
        *out++ = *in++;

    std::cin.get();
    return 0;
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">namespace mylib
{
#if HAB_COPY_N
using woisses::copy_n;
#else
template&lt;class InputIter, class OutputIter&gt;
OutputIter copy_n(InputIter first, size_t n, OutputIter out)
{
    for(; n &gt; 0; --n)
        *out++ = *first++;
    return out;
}
#endif
}

int main()
{
    using namespace std;   
    istream_iterator&lt;char&gt; in(cin);
    ostream_iterator&lt;char&gt; out(cout, &quot;\t&quot;);

    advance(in, 3);
    mylib::copy_n(in, 4, out);

    std::cin.get();
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1985121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985121</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 24 Nov 2010 13:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to Teil eines streams kopieren on Wed, 24 Nov 2010 13:55:15 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9203">@brotbernd</a>: danke für den code. Wie performant ist eine solche Lösung? werden die Zeichen da nicht alle einzeln kopiert?</p>
<p>Vielleicht kurz was zum Hintergrund: ich brauche eine Funktion um Teilbereiche einer Binär-Datei in den Speicher oder in eine separate Datei zu kopieren. Diese Teilbereiche können relativ groß sein. Fahre ich da evtl. doch besser mit meiner alten Lösung? Also dass ich die Daten blockweise (16kB oder so) in einen Buffer lese und dann wegschreibe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985153</guid><dc:creator><![CDATA[eXistence]]></dc:creator><pubDate>Wed, 24 Nov 2010 13:55:15 GMT</pubDate></item><item><title><![CDATA[Reply to Teil eines streams kopieren on Wed, 24 Nov 2010 14:24:59 GMT]]></title><description><![CDATA[<p>eXistence schrieb:</p>
<blockquote>
<p>Fahre ich da evtl. doch besser mit meiner alten Lösung? Also dass ich die Daten blockweise (16kB oder so) in einen Buffer lese und dann wegschreibe?</p>
</blockquote>
<p>Mit ziemlicher Sicherheit: Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985171</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 24 Nov 2010 14:24:59 GMT</pubDate></item></channel></rss>