<?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[Gepufferte datei schreiben und buffer setzen]]></title><description><![CDATA[<p>Hi,<br />
Ich würde gerne gepuffert in eine Datei schreiben. Leider wird mein buffer nicht verwendet. Woran kann das liegen??</p>
<pre><code class="language-cpp">char *Buffer_ptr=new char [FILE_BUFFER_SIZE];
std::filebuf *swap_file_ptr=::new std::filebuf();
swap_file_ptr-&gt;open(TmpFullFileName, std::ios::in | std::ios::out | std::ios::trunc);

swap_file_ptr-&gt;pubsetbuf(Buffer_ptr,FILE_BUFFER_SIZE);
</code></pre>
<p>Die folgenden zeilen schreiben zwar in die geöffnete Datei, aber der Buffer_ptr bleibt immer leer.</p>
<pre><code class="language-cpp">swap_file_ptr-&gt;sputn(tmp.c_str(),13);
swap_file_ptr-&gt;pubsync();
</code></pre>
<p>Wohiingegen diese zeilen nicht in die datei schreiben, jedoch natürlich der buffer nicht leer bleibt;</p>
<pre><code class="language-cpp">strcpy(Buffer_ptr,tmp.c_str());
swap_file_ptr-&gt;pubsync();
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Woran kann das liegen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ?? Was mache ich falsch ?? Das problem ist, daß ich genau den von mir vorgegebenen Buffer verwenden muß. Ansonsten gehts nicht. Also ich kann nicht zufrieden sein, daß die oberen Zeilen in die Datei schreiben. Es muß mit genau dem von mir angegebenen Buffer sein.<br />
Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/248295/gepufferte-datei-schreiben-und-buffer-setzen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 04:33:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248295.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Aug 2009 20:31:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 20:31:04 GMT]]></title><description><![CDATA[<p>Hi,<br />
Ich würde gerne gepuffert in eine Datei schreiben. Leider wird mein buffer nicht verwendet. Woran kann das liegen??</p>
<pre><code class="language-cpp">char *Buffer_ptr=new char [FILE_BUFFER_SIZE];
std::filebuf *swap_file_ptr=::new std::filebuf();
swap_file_ptr-&gt;open(TmpFullFileName, std::ios::in | std::ios::out | std::ios::trunc);

swap_file_ptr-&gt;pubsetbuf(Buffer_ptr,FILE_BUFFER_SIZE);
</code></pre>
<p>Die folgenden zeilen schreiben zwar in die geöffnete Datei, aber der Buffer_ptr bleibt immer leer.</p>
<pre><code class="language-cpp">swap_file_ptr-&gt;sputn(tmp.c_str(),13);
swap_file_ptr-&gt;pubsync();
</code></pre>
<p>Wohiingegen diese zeilen nicht in die datei schreiben, jedoch natürlich der buffer nicht leer bleibt;</p>
<pre><code class="language-cpp">strcpy(Buffer_ptr,tmp.c_str());
swap_file_ptr-&gt;pubsync();
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Woran kann das liegen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ?? Was mache ich falsch ?? Das problem ist, daß ich genau den von mir vorgegebenen Buffer verwenden muß. Ansonsten gehts nicht. Also ich kann nicht zufrieden sein, daß die oberen Zeilen in die Datei schreiben. Es muß mit genau dem von mir angegebenen Buffer sein.<br />
Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765053</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Sat, 22 Aug 2009 20:31:04 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 21:23:40 GMT]]></title><description><![CDATA[<p>Ich will jetzt nicht deinen Code durchgehen, denn deine Mühe ist umsonst: Die Dateizugriffe sind in der Regel schon gepuffert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765073</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 22 Aug 2009 21:23:40 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 22:25:54 GMT]]></title><description><![CDATA[<p>Wenn Du eine eigene Pufferung bauen willst, dann musst Du eine Scheribfunktion impleementieren, die zuerst in den Puffer schreibt:<br />
Im Prinzip so</p>
<pre><code class="language-cpp">char buff[256];
int buffered = 0;

int Write (char *data, int len)
{
   while (len)
   {
      // Anzahl bytes die in den Puffer sollen
      int bufferbytes = sizeof(buff)-buffered;
      if (len &lt; bufferbytes)
         bufferbytes = len;
      // In den Puffer kopieren
      memcpy (buff+buffered, data, bufferbytes);
      // Anzahl bytes im Puffer merken
      buffered += bufferbytes;
      // Wenn der Puffer voll ist dann die Datei schreiben
      if (buffered == sizeof(buff))
      {
          fwrite (..., sizeof(buff));  // In Datei schreiben
          buffered = 0;
      }
      // Weitermachen bis alle Daten behandelt wurden
      data += bufferbytes;
      len -= bufferbytes; 
   }
}
</code></pre>
<p>Um den Puffer am Schluss zu leeren musst Du etwa sowas machen</p>
<pre><code class="language-cpp">void Flush (void)
{
   if (buffered)
   {
      fwrite (..., buffered);
      buffered = 0:
   }
}
</code></pre>
<p>Ohne Gewähr da ungetestet. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1765094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765094</guid><dc:creator><![CDATA[general bacardi]]></dc:creator><pubDate>Sat, 22 Aug 2009 22:25:54 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 22:28:32 GMT]]></title><description><![CDATA[<p>Danke für Antwort.<br />
Das Problem ist, daß ich verhältnismäßig schnell schreiben und lesen Muß.<br />
Da 1Mio mal 1 Byte schreiben wesentlich länger dauert als 1 mal 1Mio byte, habe ich mich entschlossen einen buffer zum schreiben zu nehmen. Dabei muß ich die synchronisation (das flush() ) oder schreiben von Buffer auf Festplatte selbst bestimmmen können. Des Weitern wird nur dann geschrieben, wenn ich keinen Arbeitsspiecher mehr bekomme. Also muß auch der Buffer bereits alloiziiert sein.<br />
Die standard Bufferung bei datei I/O flusht jedesmal wenn in den Buffer geschrieben wird, unabhängig von den Daten im Buffer. Das ist für meine Verwendungszwecke nicht geeignet.<br />
Trotzdem ist der code schrot. habs jetzt hinbekommen. Ev. hat jemand das Selbe Problem. Daher hier die Lösung.</p>
<pre><code class="language-cpp">std::fstream swap_file_ptr=::new std::fstream();
char * Buffer_ptr=new char [FILE_BUFFER_SIZE];
std::streambuf *Buffer_ptr_streambuf=swap_file_ptr-&gt;rdbuf()-&gt;pubsetbuf(Buffer_ptr,FILE_BUFFER_SIZE);
swap_file_ptr-&gt;open(TmpFullFileName, std::ios::in | std::ios::out | std::ios::trunc);

//In den Buffer schreiben. nach dem Schreiben kann man sich den Inhalt in 
//Buffer_ptr anschauen. Es wird nicht in die datei geschrieben.
//Die Funktion sputn merkt sich wieviele Zeichen man geschrieben hat
Buffer_ptr_streambuf-&gt;sputn(tmp.c_str(),13);
//Auch hier wird nicht in die datei geschrieben
//Es wird an Buffer_ptr hinten angehängt
Buffer_ptr_streambuf-&gt;sputn(tmp.c_str(),13);
//Der inhalt von Buffer_ptr wird in die datei geschrieben.
//Buffer_ptr enthält zwar noch Zeichen, diese werden aber beim 
//nächsten Aufruf von sputn() überschrieben. Beim nächsten sync()
//werden wieder nur die Zeichen in die Datei geschrieben, welche sputn()
//seit dem letzten sync in Buffer_ptr geschrieben hat. 
Buffer_ptr_streambuf-&gt;pubsync();
</code></pre>
<p>Ist ne tolle Sache <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="😉"
    /><br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765096</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Sat, 22 Aug 2009 22:28:32 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 22:38:45 GMT]]></title><description><![CDATA[<p>Danke general bacardi,<br />
Habs erst nach meiner Antwort gelesen. Deine Lösung schaut gut aus.<br />
Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765100</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Sat, 22 Aug 2009 22:38:45 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 22:49:24 GMT]]></title><description><![CDATA[<p>Nur interessehalber: Hast du mal nachgemessen, wie viel du mit deinem eigenen Buffer schneller bist als ohne? Mit welchem Compiler und OS?</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765103</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Sat, 22 Aug 2009 22:49:24 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 22:49:40 GMT]]></title><description><![CDATA[<p>AlexXXx schrieb:</p>
<blockquote>
<p>Danke general bacardi,<br />
Habs erst nach meiner Antwort gelesen. Deine Lösung schaut gut aus.<br />
Gruß</p>
</blockquote>
<p>Ich habe es nicht getesttet aber das Prinzip ist klar. Wahrschinlich ist es performanter als deine std::streambuf Lösung, weil es sehr &quot;direkt&quot; ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765104</guid><dc:creator><![CDATA[general bacardi]]></dc:creator><pubDate>Sat, 22 Aug 2009 22:49:40 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 23:04:46 GMT]]></title><description><![CDATA[<p>Ja ich habe messungen gemacht. habe dabei eine bestimmte anzahl=N an bytes auf die Festplatte geschrieben. Das war zwar noch ungepuffert, aber ich habe<br />
1*N bytes geschrieben,<br />
und dan eben N in kleine Häppchen zerlegt und geschrieben.<br />
Ich habe die zahlen jetzt nicht mehr im kopf, aber schon beim Ausführen merkt man spürbar den zeitunterschied. Ansonsten hätte ich den standard buffer genommen.<br />
Des weiteren habe ich Die C I/O mit der C++ I/O (file I/O) verglichen.<br />
Bei großem N ist da kein unterschied mehrr meßbar. Auch wenn man N in häppchen zerlegt, war C nicht wirklich viel schneller.<br />
Das lohnt sich richtig, wenn man auf die Zeit achtenmuß.<br />
Gruß.<br />
P.s. Wenns wichtig ist, kann ich die Daten noch nachträglich schicken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765111</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Sat, 22 Aug 2009 23:04:46 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 23:07:46 GMT]]></title><description><![CDATA[<p>compiler habe ich GCC 4.3<br />
Aber mit:<br />
CFLAGS =-Wall -ansi -O0 -march=athlon-xp -g<br />
Mit -O2 ist -g schwachsinn, aber man kann noch was rausholen.<br />
Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765113</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Sat, 22 Aug 2009 23:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Sat, 22 Aug 2009 23:12:24 GMT]]></title><description><![CDATA[<p>OS ist ein Linux,<br />
Habich ganz vergessen. Zu Windows kann ich da nichts sagen momentan.<br />
Würde mich aber trotzdem freuen wenns auch da schneller wäre.<br />
Also wenn jemand was weiß.<br />
Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765116</guid><dc:creator><![CDATA[AlexXXx]]></dc:creator><pubDate>Sat, 22 Aug 2009 23:12:24 GMT</pubDate></item><item><title><![CDATA[Reply to Gepufferte datei schreiben und buffer setzen on Mon, 24 Aug 2009 09:59:19 GMT]]></title><description><![CDATA[<p>Hallo Alex,</p>
<p>wenn du wirklich schnell eine große Anzahl von Daten lesen und scheiben willst, dann würde ich stattdessen den <strong>ungepufferten</strong> Zugriff wählen (denn durch den Puffer hast du unnötige Kopierarbeiten):</p>
<pre><code class="language-cpp">swap_file_ptr-&gt;setbuf(0, 0);
</code></pre>
<p>Teste es mal aus...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1765697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1765697</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Mon, 24 Aug 2009 09:59:19 GMT</pubDate></item></channel></rss>