<?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[Binärdatei schreiben]]></title><description><![CDATA[<p>Hi @ all,</p>
<p>ich muss einige Werte in eine Binärdatei schreiben.</p>
<p>dazu verwende ich zunächst ofstream:</p>
<p>std::ofstream rd(argv_[1], std::ios::binary | std::ios::ate);</p>
<p>auszugebende Werte:</p>
<p>std::string stringname;<br />
unsigned int x;<br />
char magic[4] = {'x','y','z','\0'};</p>
<p>Mit welchen Methoden schreibe ich die verschiedenen Datentypen jetzt<br />
in die Binärdatei?</p>
<p>Wenn ich schreieb: rd.put(x) belegt der wert x in der binärdatei nur 2 Byte.<br />
unsigned int braucht doch 4 Byte oder?</p>
<p>Wäre super wenn mir hier jemand helfen könnte.</p>
<p>thx</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284486/binärdatei-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 23:17:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284486.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 02 Apr 2011 16:17:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Binärdatei schreiben on Sat, 02 Apr 2011 16:17:54 GMT]]></title><description><![CDATA[<p>Hi @ all,</p>
<p>ich muss einige Werte in eine Binärdatei schreiben.</p>
<p>dazu verwende ich zunächst ofstream:</p>
<p>std::ofstream rd(argv_[1], std::ios::binary | std::ios::ate);</p>
<p>auszugebende Werte:</p>
<p>std::string stringname;<br />
unsigned int x;<br />
char magic[4] = {'x','y','z','\0'};</p>
<p>Mit welchen Methoden schreibe ich die verschiedenen Datentypen jetzt<br />
in die Binärdatei?</p>
<p>Wenn ich schreieb: rd.put(x) belegt der wert x in der binärdatei nur 2 Byte.<br />
unsigned int braucht doch 4 Byte oder?</p>
<p>Wäre super wenn mir hier jemand helfen könnte.</p>
<p>thx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043776</guid><dc:creator><![CDATA[xxmaxx]]></dc:creator><pubDate>Sat, 02 Apr 2011 16:17:54 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei schreiben on Sat, 02 Apr 2011 16:31:16 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/iostream/ostream/write/" rel="nofollow">write</a></p>
<pre><code class="language-cpp">file.write(magic, 4);
unsigned i;
static_assert(sizeof(i) == 4); //nehm ich jetzt mal an
file.write(reinterpret_cast&lt;const char *&gt;(&amp;i), sizeof(i));
std::string str;
file.write(str.c_str(), str.size());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2043779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043779</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 02 Apr 2011 16:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei schreiben on Sat, 02 Apr 2011 16:44:36 GMT]]></title><description><![CDATA[<p>super hat funktioniert. kannst du mir vl noch die zeilen erklären?</p>
<p>was macht</p>
<p>static_assert(sizeof(i) == 4)</p>
<p>und</p>
<p>file.write(reinterpret_cast&lt;const char *&gt;(&amp;i), sizeof(i));</p>
<p>genau? wieso muss ich hier ein reinterpret_cast machen?</p>
<p>thx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043788</guid><dc:creator><![CDATA[xxmaxx]]></dc:creator><pubDate>Sat, 02 Apr 2011 16:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei schreiben on Sat, 02 Apr 2011 17:31:33 GMT]]></title><description><![CDATA[<p>static_assert() funktioniert so ähnlich wie assert(), wird allerdings schon beim Compilieren ausgewertet. Damit liefert der Compiler einen Fehler, wenn die Größe eines &quot;unsigned int&quot; nicht gleich 4 ist.</p>
<p>Der reinterpret_cast interpretiert den übergebenen Wert neu - in dem Fall übergibst du einen Zeiger auf unsigned und verwendest ihn, als wäre er ein Zeiger auf char. Sowas macht man nur, wenn man weiß was man tut - ich bin mir noch nichtmal sicher, ob das hier überhaupt notwendig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043806</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 02 Apr 2011 17:31:33 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei schreiben on Sat, 02 Apr 2011 18:03:31 GMT]]></title><description><![CDATA[<p>alles klar. vielen dank für die hilfe <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/2043825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043825</guid><dc:creator><![CDATA[xxmaxx]]></dc:creator><pubDate>Sat, 02 Apr 2011 18:03:31 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei schreiben on Sat, 02 Apr 2011 19:31:12 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>static_assert() funktioniert so ähnlich wie assert(), wird allerdings schon beim Compilieren ausgewertet. Damit liefert der Compiler einen Fehler, wenn die Größe eines &quot;unsigned int&quot; nicht gleich 4 ist.</p>
<p>Der reinterpret_cast interpretiert den übergebenen Wert neu - in dem Fall übergibst du einen Zeiger auf unsigned und verwendest ihn, als wäre er ein Zeiger auf char. Sowas macht man nur, wenn man weiß was man tut - ich bin mir noch nichtmal sicher, ob das hier überhaupt notwendig ist.</p>
</blockquote>
<p>Theoretisch wäre ein static_cast auf const void* und dann ein static_cast auf const char* am besten. <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/2043857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043857</guid><dc:creator><![CDATA[Ethon_]]></dc:creator><pubDate>Sat, 02 Apr 2011 19:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei schreiben on Sat, 02 Apr 2011 20:55:05 GMT]]></title><description><![CDATA[<p>Ethon_ schrieb:</p>
<blockquote>
<p>Theoretisch wäre ein static_cast auf const void* und dann ein static_cast auf const char* am besten. <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>
</blockquote>
<p>Warum am besten? Genau dafür gibt es doch <code>reinterpret_cast</code> . Der vermeidet sowohl den Umweg über <code>void *</code> , als auch den unscheinbaren C-Cast.</p>
<p>Natürlich sollte man beachten, dass <code>unsigned</code> wie die meisten Typen nicht auf allen Plattformen gleich groß ist. Es scheint so harmlos, sich auf die Größe von Typen zu verlassen. &quot;Immer diese Frickler mit ihren exotischen Plattformen und den komischen Datentypen.&quot; Ein Beispiel aus der Praxis zeigt aber, dass das ein Trugschluss ist: <code>time_t</code> war bei Visual C++ 7 noch 32 bit groß, einige Versionen später hat Microsoft den Typ auf 64 bit vergrößert. Wenn dieser Typ in einem Binärprotokoll verwendet wurde, konnten schwer zu findende Bugs entstehen. Das weiß ich aus eigener Erfahrung (nein, ich habe den Code nicht geschrieben, sondern nur korrigiert). Niemand garantiert, dass andere Typen immer gleich groß sein werden. Also sollte man sich von Anfang an angewöhnen, <code>typedef</code> s zu verwenden. Am besten aus<a href="http://boost.org" rel="nofollow"> <code>boost/cstdint.hpp</code> </a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043892</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 02 Apr 2011 20:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei schreiben on Sat, 02 Apr 2011 20:55:20 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Ethon_ schrieb:</p>
<blockquote>
<p>Theoretisch wäre ein static_cast auf const void* und dann ein static_cast auf const char* am besten. <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>
</blockquote>
<p>Warum am besten? Genau dafür gibt es doch <code>reinterpret_cast</code> . Der vermeidet sowohl den Umweg über <code>void *</code> , als auch den unscheinbaren C-Cast.</p>
</blockquote>
<p>Es wäre am Sichersten, dafür ist es mehr Schreibarbeit.<br />
Ein reinterpret_cast kann alles zu einem const char* verwursten, per static_cast nur pointer.</p>
<p>Hätte er zb vergessen sein int i zu referenzieren, hätte der Compiler das mit einem reinterpreted_cast ohne Meckern geschluckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043896</guid><dc:creator><![CDATA[Ethon_]]></dc:creator><pubDate>Sat, 02 Apr 2011 20:55:20 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei schreiben on Sat, 02 Apr 2011 21:05:39 GMT]]></title><description><![CDATA[<p>Ethon_ schrieb:</p>
<blockquote>
<p>Es wäre am Sichersten, dafür ist es mehr Schreibarbeit.<br />
Ein reinterpret_cast kann alles zu einem const char* verwursten, per static_cast nur pointer.</p>
<p>Hätte er zb vergessen sein int i zu referenzieren, hätte der Compiler das mit einem reinterpreted_cast ohne Meckern geschluckt.</p>
</blockquote>
<p>Ja, das ist ein Argument. Vielleicht sollte man sich eine Template-Funktion <code>pointer_cast</code> oder so bauen, welche die Typen prüft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2043898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2043898</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 02 Apr 2011 21:05:39 GMT</pubDate></item></channel></rss>