<?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::string binär in datei ausgeben]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>ich hab ein problem mit der binären ein und ausgabe<br />
erstmal das hier als grundgerüst:</p>
<pre><code class="language-cpp">struct struktur
{
    std::string name;
    struct innereStruktur
    {
        int i;
        // und mehr von diesen primitiven datentypen
    };
    struct innerereStruktur
    {
        float f;
        // und mehr von diesen primitiven datentypen
    };
};
</code></pre>
<p>so das ist meine struktur die ich in einer datei speichern will, und zwar so:</p>
<pre><code class="language-cpp">// ausgabe
struktur s; // mit initialisierung usw....
std::ofstream fout(&quot;file.bin&quot;, std::ios::binary);
fout.write(reinterpret_cast&lt;char*&gt;(&amp;s), sizeof(s));
fout.close();

//eingabe
std::ifstream fin(&quot;file.bin&quot;, std::ios::binary);
fin.read(reinterpret_cast&lt;char*&gt;(&amp;s), sizeof(s));
fin.close();
</code></pre>
<p>so, das klappt auch soweit auf den ersten blick ganz gut. aber wenn mein programm beendet kommt ein stack corruption error.<br />
ich tippe mal dadrauf, dass string itnern ja nur einen char pointer speichert sowie die grössen des string und so weiter. Und wenn man die daten jetzt neu einliest versucht er and er gleichen stelle zu schreiben, wie in dem vorigen programm, das diese datei speicherte - sprich komplett an der falschen stelle...</p>
<p>kommt das vom denkansatz hin?<br />
und wie gebe ich einen std::string richtig binär aus?</p>
<p>so in etwa?</p>
<pre><code class="language-cpp">std::string s = &quot;hallo binaere Welt!&quot;
std::ofstream out(&quot;text.bin&quot;, std::ios::binary);
for(size_t i = 0; i &lt; s.size(); i++)
    out.write(reinterpret_cast&lt;char*&gt;(&amp;s[i]), sizeof(s[i]));
</code></pre>
<p>mfg mosho</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288163/std-string-binär-in-datei-ausgeben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 03:16:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288163.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Jun 2011 14:01:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::string binär in datei ausgeben on Sat, 11 Jun 2011 14:01:30 GMT]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>ich hab ein problem mit der binären ein und ausgabe<br />
erstmal das hier als grundgerüst:</p>
<pre><code class="language-cpp">struct struktur
{
    std::string name;
    struct innereStruktur
    {
        int i;
        // und mehr von diesen primitiven datentypen
    };
    struct innerereStruktur
    {
        float f;
        // und mehr von diesen primitiven datentypen
    };
};
</code></pre>
<p>so das ist meine struktur die ich in einer datei speichern will, und zwar so:</p>
<pre><code class="language-cpp">// ausgabe
struktur s; // mit initialisierung usw....
std::ofstream fout(&quot;file.bin&quot;, std::ios::binary);
fout.write(reinterpret_cast&lt;char*&gt;(&amp;s), sizeof(s));
fout.close();

//eingabe
std::ifstream fin(&quot;file.bin&quot;, std::ios::binary);
fin.read(reinterpret_cast&lt;char*&gt;(&amp;s), sizeof(s));
fin.close();
</code></pre>
<p>so, das klappt auch soweit auf den ersten blick ganz gut. aber wenn mein programm beendet kommt ein stack corruption error.<br />
ich tippe mal dadrauf, dass string itnern ja nur einen char pointer speichert sowie die grössen des string und so weiter. Und wenn man die daten jetzt neu einliest versucht er and er gleichen stelle zu schreiben, wie in dem vorigen programm, das diese datei speicherte - sprich komplett an der falschen stelle...</p>
<p>kommt das vom denkansatz hin?<br />
und wie gebe ich einen std::string richtig binär aus?</p>
<p>so in etwa?</p>
<pre><code class="language-cpp">std::string s = &quot;hallo binaere Welt!&quot;
std::ofstream out(&quot;text.bin&quot;, std::ios::binary);
for(size_t i = 0; i &lt; s.size(); i++)
    out.write(reinterpret_cast&lt;char*&gt;(&amp;s[i]), sizeof(s[i]));
</code></pre>
<p>mfg mosho</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076750</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 11 Jun 2011 14:01:30 GMT</pubDate></item><item><title><![CDATA[Reply to std::string binär in datei ausgeben on Sat, 11 Jun 2011 14:08:15 GMT]]></title><description><![CDATA[<p>ja, oder so<br />
write(s.c_str(), sizeof(char)*s.size())</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076753</guid><dc:creator><![CDATA[ja]]></dc:creator><pubDate>Sat, 11 Jun 2011 14:08:15 GMT</pubDate></item><item><title><![CDATA[Reply to std::string binär in datei ausgeben on Sat, 11 Jun 2011 14:09:03 GMT]]></title><description><![CDATA[<p>und die länge speichern</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076754</guid><dc:creator><![CDATA[ja]]></dc:creator><pubDate>Sat, 11 Jun 2011 14:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::string binär in datei ausgeben on Sat, 11 Jun 2011 14:23:22 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>so, das klappt auch soweit auf den ersten blick ganz gut. aber wenn mein programm beendet kommt ein stack corruption error.<br />
ich tippe mal dadrauf, dass string itnern ja nur einen char pointer speichert sowie die grössen des string und so weiter. Und wenn man die daten jetzt neu einliest versucht er and er gleichen stelle zu schreiben, wie in dem vorigen programm, das diese datei speicherte - sprich komplett an der falschen stelle...</p>
<p>kommt das vom denkansatz hin?</p>
</blockquote>
<p>Ja, das kommt hin - ostream::write() schreibt nur die Inhalte <strong>im</strong> Objekt (beim String nur der Pointer und Größe/Kapazität). Daß du dort beim Rücklesen noch was gesehen hast, liegt vermutlich daran, daß du es aus dem selben Programm heraus gelesen hast und der Speicherbereich des ursprünglichen Strings noch nicht freigegeben bzw. überschrieben war.</p>
<p>Als Lösung würde mir nur einfallen, den String manuell zu behandeln (entweder im Format Länge+Daten oder Daten+Trennzeichen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076757</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 11 Jun 2011 14:23:22 GMT</pubDate></item><item><title><![CDATA[Reply to std::string binär in datei ausgeben on Sat, 11 Jun 2011 15:51:22 GMT]]></title><description><![CDATA[<p>naja, klar das könnte ich - also das trennen und so - aber ich wollte nur testweise damit mein programm läuft quick und dirty eine übergangslösung hinklatschen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076775</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 11 Jun 2011 15:51:22 GMT</pubDate></item></channel></rss>