<?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[mit memcpy und fstream in Datei schreiben]]></title><description><![CDATA[<p>Hi,<br />
Ich möchte in eine Datei schreiben.<br />
das würde ich gerne gepuffert machen.</p>
<pre><code class="language-cpp">char Buffer_ptr[FILE_BUFFER_SIZE];
std::fstream swap_file_ptr(&quot;sdfsfd&quot;,ios....);
std::streambuf *Buffer_ptr_streambuf;
Buffer_ptr_streambuf=swap_file_ptr.rdbuf()-&gt;pubsetbuf(Buffer_ptr,FILE_BUFFER_SIZE);
</code></pre>
<p>Ich kann jetzt über den pointer Buffer_ptr_streambuf in Buffer_ptr schreiben mit</p>
<pre><code class="language-cpp">Buffer_ptr_streambuf-&gt;sputn(&quot;..........&quot;,sizeof(&quot;.........&quot;));
</code></pre>
<p>Wenn ich nun den Buffer_ptr in die Datei schreiben will so muß ich</p>
<pre><code class="language-cpp">Buffer_ptr_streambuf-&gt;pubsync();
</code></pre>
<p>Das funktioniert so, daß die Funktion sputn den<br />
streambuf::epptr<br />
pointer auf das zuletzt geschriebene Byte int Buffer_ptr setzt. So habe ich das zumindest verstanden.<br />
Das<br />
streambuf::pubsync()<br />
Schreibt dann vom startpunkt bis zum streambuf::epptr.</p>
<p>--------------------------------------------------------------------<br />
Kann ich irgendwie den epptr pointer selber setzen????<br />
Ziel ist es folgendes machen zu können:</p>
<pre><code class="language-cpp">//In das Buffer Array schreiben
memcpy(Buffer_ptr,&quot;........&quot;,sizeof(&quot;...........&quot;));
//std::streambuf sagen daß zeichen im buffer sind
?????????????????????;
//Die Zeichen in die Datei schreiben
Buffer_ptr_streambuf-&gt;pubsync();
</code></pre>
<p>Also wie bekomme ich das<br />
?????????????????;<br />
hin ??<br />
---------------------------------------------------------------------<br />
Ableiten weiß ich nicht wie, da die<br />
std::streambuf<br />
Instanz von<br />
std::fstream<br />
erzeugt wurde.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/248739/mit-memcpy-und-fstream-in-datei-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 21:08:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248739.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Aug 2009 12:11:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 12:11:42 GMT]]></title><description><![CDATA[<p>Hi,<br />
Ich möchte in eine Datei schreiben.<br />
das würde ich gerne gepuffert machen.</p>
<pre><code class="language-cpp">char Buffer_ptr[FILE_BUFFER_SIZE];
std::fstream swap_file_ptr(&quot;sdfsfd&quot;,ios....);
std::streambuf *Buffer_ptr_streambuf;
Buffer_ptr_streambuf=swap_file_ptr.rdbuf()-&gt;pubsetbuf(Buffer_ptr,FILE_BUFFER_SIZE);
</code></pre>
<p>Ich kann jetzt über den pointer Buffer_ptr_streambuf in Buffer_ptr schreiben mit</p>
<pre><code class="language-cpp">Buffer_ptr_streambuf-&gt;sputn(&quot;..........&quot;,sizeof(&quot;.........&quot;));
</code></pre>
<p>Wenn ich nun den Buffer_ptr in die Datei schreiben will so muß ich</p>
<pre><code class="language-cpp">Buffer_ptr_streambuf-&gt;pubsync();
</code></pre>
<p>Das funktioniert so, daß die Funktion sputn den<br />
streambuf::epptr<br />
pointer auf das zuletzt geschriebene Byte int Buffer_ptr setzt. So habe ich das zumindest verstanden.<br />
Das<br />
streambuf::pubsync()<br />
Schreibt dann vom startpunkt bis zum streambuf::epptr.</p>
<p>--------------------------------------------------------------------<br />
Kann ich irgendwie den epptr pointer selber setzen????<br />
Ziel ist es folgendes machen zu können:</p>
<pre><code class="language-cpp">//In das Buffer Array schreiben
memcpy(Buffer_ptr,&quot;........&quot;,sizeof(&quot;...........&quot;));
//std::streambuf sagen daß zeichen im buffer sind
?????????????????????;
//Die Zeichen in die Datei schreiben
Buffer_ptr_streambuf-&gt;pubsync();
</code></pre>
<p>Also wie bekomme ich das<br />
?????????????????;<br />
hin ??<br />
---------------------------------------------------------------------<br />
Ableiten weiß ich nicht wie, da die<br />
std::streambuf<br />
Instanz von<br />
std::fstream<br />
erzeugt wurde.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768228</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Fri, 28 Aug 2009 12:11:42 GMT</pubDate></item><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 13:10:40 GMT]]></title><description><![CDATA[<p>Das hier klingt nach dem, was du suchst:</p>
<p><a href="http://www.cplusplus.com/reference/iostream/streambuf/setp/" rel="nofollow">http://www.cplusplus.com/reference/iostream/streambuf/setp/</a></p>
<p>Frage: Dir ist aber schon klar, dass die Standardein-/ausgabe bereits gepuffert ist? Wenn du durch deine memcpy Operation nicht irgendeine neue tolle Funktionalität bekommst, ist dein Programm - zumindest geschwindigkeitstechnisch - kein Fortschritt.</p>
<p>Finde ich aber trotzdem mal interessant zu sehen, wie man die Streamoperatoren selbst implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768278</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 28 Aug 2009 13:10:40 GMT</pubDate></item><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 13:35:57 GMT]]></title><description><![CDATA[<p>/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/streambuf</p>
<pre><code class="language-cpp">528       /**
529        *  @brief  Setting the three write area pointers.
530        *  @param  pbeg  A pointer.
531        *  @param  pend  A pointer.
532        *  @post  @a pbeg == <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@c</a> pbase(), @a pbeg == <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@c</a> pptr(), and
533        *         @a pend == <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@c</a> epptr()
534       */
535       void
536       setp(char_type* __pbeg, char_type* __pend)
537       {
538         _M_out_beg = _M_out_cur = __pbeg;
539         _M_out_end = __pend;
540       }
</code></pre>
<pre><code class="language-cpp">515       char_type*
516       epptr() const { return _M_out_end; }
</code></pre>
<p>Mir genügt das ende. Die funktion war nicht das Problem. Beide Member sind protected. Ich habe keinen zugriff.<br />
Ich versuche nun:</p>
<pre><code class="language-cpp">class my_streambuf : public std::streambuf
{
   public:
        char* my_epptr() const { return std::streambuf::epptr(); }
};
</code></pre>
<p>Dann einen Pointer vom Type<br />
my_streambuf<br />
Und dann zugreifen.<br />
Hoffe das klappt.</p>
<p>Wegen der Standartpufferung:<br />
Das wird eine Rescue funktion die auf die Festpalatte schreibt, wenn kein Arbeitsspeicher im System mehr verfügbar ist.<br />
+ Sie muß schnell gehen.<br />
Deswegen eigene Pufferung.</p>
<p>gtuß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768298</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Fri, 28 Aug 2009 13:35:57 GMT</pubDate></item><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 14:10:46 GMT]]></title><description><![CDATA[<p>Hi SepJ,<br />
Hab ganz übersehen, daß mir epptr ja nur den pointer gibt, ich ihn aber nicht setzen kann. Du hast Recht mit deiner Funktione. Danke nochmal.</p>
<p>Das ganze läuft jetzt.<br />
Die Lösung:</p>
<pre><code class="language-cpp">class my_streambuf : public std::streambuf
{
   public:
        char* my_epptr() const { return std::streambuf::epptr(); }
        void my_setp(char *start,char *end){ setp(start,end);}
};

char Buffer_ptr[FILE_BUFFER_SIZE];
std::fstream swap_file_ptr(&quot;sdfsfd&quot;,ios....);
std::my_streambuf *Buffer_ptr_streambuf;
Buffer_ptr_streambuf=reinterpret_cast&lt;my_streambuf *&gt;swap_file_ptr.rdbuf()-&gt;pubsetbuf(Buffer_ptr,FILE_BUFFER_SIZE);
</code></pre>
<p>Dann kann man mit</p>
<pre><code class="language-cpp">//In das Buffer Array schreiben
memcpy(Buffer_ptr,&quot;........&quot;,sizeof(&quot;...........&quot;));
//std::streambuf sagen daß zeichen im buffer sind
Buffer_ptr_streambuf-&gt;my_setp(Buffer_ptr,(Buffer_ptr+tmpp.size()));
//Die Zeichen in die Datei schreiben
Buffer_ptr_streambuf-&gt;pubsync();
</code></pre>
<p>In die Datei schreiben.<br />
Frag mich ob ich die Pointer wieder zurücksetzen muß, um die alte Funktionalität der Klasse zu behalten.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768317</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Fri, 28 Aug 2009 14:10:46 GMT</pubDate></item><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 14:19:38 GMT]]></title><description><![CDATA[<p>AlexXXx schrieb:</p>
<blockquote>
<p>/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/streambuf</p>
<pre><code class="language-cpp">528       /**
529        *  @brief  Setting the three write area pointers.
530        *  @param  pbeg  A pointer.
531        *  @param  pend  A pointer.
532        *  @post  @a pbeg == <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@c</a> pbase(), @a pbeg == <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@c</a> pptr(), and
533        *         @a pend == <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/869">@c</a> epptr()
534       */
535       void
536       setp(char_type* __pbeg, char_type* __pend)
537       {
538         _M_out_beg = _M_out_cur = __pbeg;
539         _M_out_end = __pend;
540       }
</code></pre>
<pre><code class="language-cpp">515       char_type*
516       epptr() const { return _M_out_end; }
</code></pre>
<p>Mir genügt das ende. Die funktion war nicht das Problem. Beide Member sind protected. Ich habe keinen zugriff.</p>
</blockquote>
<p>Häh? Die Funktion setp macht doch EXAKT das was du willst, sowohl laut Standardreferenz als auch im Quellcode, wie du gesehen hast.</p>
<p>edit: Ok, da hast du es selbst schneller gemerkt, als ich geantwortet habe.</p>
<blockquote>
<p>Wegen der Standartpufferung:<br />
Das wird eine Rescue funktion die auf die Festpalatte schreibt, wenn kein Arbeitsspeicher im System mehr verfügbar ist.<br />
+ Sie muß schnell gehen.<br />
Deswegen eigene Pufferung.</p>
<p>gtuß</p>
</blockquote>
<p>Das kann ich mal überhaupt nicht nachvollziehen: Der Speicher ist voll und du legst noch zusätzlich deinen eigenen Ausgabepuffer an der Speicher braucht und das alles, obwohl es bereits eine gepufferte Ausgabe gibt?</p>
<p>Um im Notfall etwas zu retten will man eher eine ungepufferte Ausgabe (wie cerr), damit überhaupt noch irgendwas auf der Platte ankommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768320</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 28 Aug 2009 14:19:38 GMT</pubDate></item><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 15:04:57 GMT]]></title><description><![CDATA[<p>Nein der Speicher zum auslagern ist fest und wird im konstruktor erzeugt.<br />
Das Problem waren nicht die Funktionen. Das muß man ja nur nachlesen.<br />
Lediglich daß eben jene, welche ich benötigte protected sind.<br />
Siehe:<br />
<a href="http://www.cplusplus.com/reference/iostream/streambuf/" rel="nofollow">http://www.cplusplus.com/reference/iostream/streambuf/</a><br />
Ich habe im ersten text schon geschrieben, daß ich nicht weiß wie ich ableiten muß. Hatte aber schnell die Lösung.<br />
Man kann den Zugriffsschutz umgehen, in dem man eine Klasse von<br />
streambuf ableitet, und dann öffentlich funktionen deklariert, welche dann die benötigten Funktionen aufrufen.</p>
<p>Die erste lösung ist falsch. Es wird noch folgendes benötigt:</p>
<pre><code class="language-cpp">class my_streambuf : public std::streambuf
{
   public:
        char* my_epptr() const { return std::streambuf::epptr(); }
        void my_setp(char *start,char *end){ setp(start,end);}
        //erhöht den put zähler um n
        void my_pbump(int n){pbump(n);}

};

char Buffer_ptr[FILE_BUFFER_SIZE];
std::fstream swap_file_ptr(&quot;sdfsfd&quot;,ios....);
std::my_streambuf *Buffer_ptr_streambuf;
Buffer_ptr_streambuf=reinterpret_cast&lt;my_streambuf *&gt;swap_file_ptr.rdbuf()-&gt;pubsetbuf(Buffer_ptr,FILE_BUFFER_SIZE);
</code></pre>
<p>Schreiben mit:</p>
<pre><code class="language-cpp">//In das Buffer Array schreiben
memcpy(Buffer_ptr,&quot;........&quot;,sizeof(&quot;...........&quot;));
//std::streambuf sagen daß zeichen im buffer sind
Buffer_ptr_streambuf-&gt;my_setp(Buffer_ptr,(Buffer_ptr+tmpp.size()));
//Den put zähler erhöhen
Buffer_ptr_streambuf-&gt;my_pbump(tmpp.size());
//Die Zeichen in die Datei schreiben
Buffer_ptr_streambuf-&gt;pubsync();
</code></pre>
<p>Schreiben mit nur dem put zähler erhöhen schlägt genau so fehl wie schreiben mit<br />
Grenzen nicht setzen.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768350</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Fri, 28 Aug 2009 15:04:57 GMT</pubDate></item><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 15:13:08 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /><br />
Wenn ich fertig bin, werde ich auf die Festplatte schreiben können, ohne weiteren Speicher zu benötigen. Und jener Speicher den ich habe, wird nicht mehr freigegeben, bis die Instanz der klasse vom Speicher genommen wird.</p>
<p>Kurtz: Ist genügend Speicher vorhanden, um die Klasse zu instanzieren, kann sie ausschließlich auf der Festplatte arbeiten. Damit das System nicht ganz in die knie geht benötige ich einen puffer, dessen Größe konstant sein muß und im konstruktor alloziirt wird.</p>
<p>Wenn ich die arbeit hier nicht mache, ist ja klar dass nichts mehr auf der Festplatte ankommt.<br />
Deswegen.</p>
<p>Rescue<br />
+geschwindigkeit<br />
-&gt;eigener puffer</p>
<p>Genau das ist ja der Sinn des ganzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768355</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Fri, 28 Aug 2009 15:13:08 GMT</pubDate></item><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 15:16:28 GMT]]></title><description><![CDATA[<p>Im übrigen macht das normalerweise das betriebssystem von selbst, das ist aber irrsinnig langsam.<br />
new(nothrow)<br />
Man muß was tuen damit ne ausnahme geworfen wird. Zumindest bei meinem kompiler.</p>
<p>gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768360</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Fri, 28 Aug 2009 15:16:28 GMT</pubDate></item><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 15:26:02 GMT]]></title><description><![CDATA[<p>AlexXXx schrieb:</p>
<blockquote>
<p>new(nothrow)<br />
Man muß was tuen damit ne ausnahme geworfen wird. Zumindest bei meinem kompiler.</p>
</blockquote>
<p>was willst du damit sagen? Oo</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768366</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 28 Aug 2009 15:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to mit memcpy und fstream in Datei schreiben on Fri, 28 Aug 2009 15:40:44 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title="=)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1768376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1768376</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Fri, 28 Aug 2009 15:40:44 GMT</pubDate></item></channel></rss>