<?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[Objektorientiertes Laden&#x2F;Speichern aus Binärdateien]]></title><description><![CDATA[<p>Hi! Ich habe ein organisatorisches Problem.</p>
<p>Und zwar muss man ja beim Laden/Speichern aus einer Binärdatei immer die Anzahl der Bytes angeben.</p>
<p>z.B.</p>
<pre><code class="language-cpp">cTest t;
fout.write ((char*)&amp;t, sizeof (t));
</code></pre>
<p>Die große Frage ist jetzt: was ist wenn ich eine von <em>cTest abgeleitete</em> Klasse laden möchte.<br />
Was wenn die Lade-Funktion gar nicht weiß dass ein <strong>cTest2</strong>-Objekt zu laden ist sondern nur dass es irgendein von cTest abgeleitetes objekt sein soll.</p>
<p>Meine bisherige Lösung:<br />
1. einen Wert auslesen, der in der Datei vor den eigentlichen Daten abgespeichert ist.<br />
Der gibt an, von welchem Datentyp das nachfolgende ist.<br />
2. richtiges Objekt erstellen und laden</p>
<pre><code class="language-cpp">fin.read (&amp;iDatatypeFlag, sizeof (int));
cTest* pObjectToLoad = NULL;
if (iDatatypeFlag == CLASS_TYPE_TEST2)
{
    pObjectToLoad = new cTest2;
    fin.read (&amp;t, sizeof (cTest2));
}
// else if (iDatatypeFlag == CLASS_TYPE_TEST3) usw.
// oder so ähnlich halt.
</code></pre>
<p>Funktionieren tut das alles aber es kotzt mich an, in einem objektorientierten Code mit Daten-Typ-Flags zu arbeiten.</p>
<p>Ich hab in google nix gefunden ausser Anfänger-Speicher-Tutorials.</p>
<p>Kennt da jemand eine Flag-Freie Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/221011/objektorientiertes-laden-speichern-aus-binärdateien</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 14:09:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221011.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 24 Aug 2008 15:12:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 15:12:17 GMT]]></title><description><![CDATA[<p>Hi! Ich habe ein organisatorisches Problem.</p>
<p>Und zwar muss man ja beim Laden/Speichern aus einer Binärdatei immer die Anzahl der Bytes angeben.</p>
<p>z.B.</p>
<pre><code class="language-cpp">cTest t;
fout.write ((char*)&amp;t, sizeof (t));
</code></pre>
<p>Die große Frage ist jetzt: was ist wenn ich eine von <em>cTest abgeleitete</em> Klasse laden möchte.<br />
Was wenn die Lade-Funktion gar nicht weiß dass ein <strong>cTest2</strong>-Objekt zu laden ist sondern nur dass es irgendein von cTest abgeleitetes objekt sein soll.</p>
<p>Meine bisherige Lösung:<br />
1. einen Wert auslesen, der in der Datei vor den eigentlichen Daten abgespeichert ist.<br />
Der gibt an, von welchem Datentyp das nachfolgende ist.<br />
2. richtiges Objekt erstellen und laden</p>
<pre><code class="language-cpp">fin.read (&amp;iDatatypeFlag, sizeof (int));
cTest* pObjectToLoad = NULL;
if (iDatatypeFlag == CLASS_TYPE_TEST2)
{
    pObjectToLoad = new cTest2;
    fin.read (&amp;t, sizeof (cTest2));
}
// else if (iDatatypeFlag == CLASS_TYPE_TEST3) usw.
// oder so ähnlich halt.
</code></pre>
<p>Funktionieren tut das alles aber es kotzt mich an, in einem objektorientierten Code mit Daten-Typ-Flags zu arbeiten.</p>
<p>Ich hab in google nix gefunden ausser Anfänger-Speicher-Tutorials.</p>
<p>Kennt da jemand eine Flag-Freie Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570540</guid><dc:creator><![CDATA[gloebl]]></dc:creator><pubDate>Sun, 24 Aug 2008 15:12:17 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 16:26:30 GMT]]></title><description><![CDATA[<p>Wirst du im C++ nicht anders hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570565</guid><dc:creator><![CDATA[WhiteWedding]]></dc:creator><pubDate>Sun, 24 Aug 2008 16:26:30 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 18:51:35 GMT]]></title><description><![CDATA[<p>gloebl schrieb:</p>
<blockquote>
<p>...Laden/Speichern aus einer Binärdatei ...</p>
</blockquote>
<p>.. besser lassen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
(Habe keine Lust, zum 100ten Mal dasselbe zu schreiben ... mal sehen, ob ich auf die Schnelle den Link finde)</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570642</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sun, 24 Aug 2008 18:51:35 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 19:11:36 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>gloebl schrieb:</p>
<blockquote>
<p>...Laden/Speichern aus einer Binärdatei ...</p>
</blockquote>
<p>.. besser lassen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
(Habe keine Lust, zum 100ten Mal dasselbe zu schreiben ... mal sehen, ob ich auf die Schnelle den Link finde)</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>Wenn du schon dabei bist. Jemand hat mal eine Klasse geschrieben, die binäre Ein/Ausgabe wie mit Textfiles verfügbar macht. War +- 1 Woche her. <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/1570651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570651</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 24 Aug 2008 19:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 19:29:03 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>gloebl schrieb:</p>
<blockquote>
<p>...Laden/Speichern aus einer Binärdatei ...</p>
</blockquote>
<p>.. besser lassen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
(Habe keine Lust, zum 100ten Mal dasselbe zu schreiben ... mal sehen, ob ich auf die Schnelle den Link finde)</p>
</blockquote>
<p>Im prinzip ist binäres Speichern nicht schwerer als nur als Text zu speichern. Wird auch fast überall gemacht, z.B. alle möglichen Header von Bildern, Videos, Musik und die Daten dazu sind sogut wie immer binär, ZIP usw. Text braucht man nur, wenn es Menschen lesen können sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570663</guid><dc:creator><![CDATA[naja]]></dc:creator><pubDate>Sun, 24 Aug 2008 19:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 20:07:30 GMT]]></title><description><![CDATA[<p>boost serialize?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570684</guid><dc:creator><![CDATA[void*]]></dc:creator><pubDate>Sun, 24 Aug 2008 20:07:30 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 21:07:28 GMT]]></title><description><![CDATA[<p>Falls du Serialisierung von MFC-Klassen meinst: Das löst aber nicht mein Problem, dass ich nicht weiß welche Klasse ich beim Laden erzeugen muss. (soweit ich das verstanden hab)</p>
<p>Es scheint auch so zu sein, dass beim Serialisieren jede Klasse ihren eigenen Speichern-/Laden-Code mitbringen muss.<br />
Wenn ich daran denke, dass ich jeder speicherbaren Klasse noch sowas verpassen muss wird mir ganz anders...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570706</guid><dc:creator><![CDATA[gloebl]]></dc:creator><pubDate>Sun, 24 Aug 2008 21:07:28 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 21:11:21 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/libs/serialization" rel="nofollow">Boost.Serialization</a> kann das (nebenbei, Klasse ≠ Objekt), man benutzt dafür RTTI (also typeid bzw. dynamic_cast).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570708</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 24 Aug 2008 21:11:21 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 21:19:36 GMT]]></title><description><![CDATA[<p>Scheint trotzdem darauf hinauszulaufen, dass jede Klasse ihre eigene Load/Save-Methode hat, demnach die Klasse selbst <strong>vorher</strong> bekannt sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570711</guid><dc:creator><![CDATA[gloebl]]></dc:creator><pubDate>Sun, 24 Aug 2008 21:19:36 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Sun, 24 Aug 2008 21:37:01 GMT]]></title><description><![CDATA[<p>Anderes erlaubt das C++-Objektsystem nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570716</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 24 Aug 2008 21:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Mon, 25 Aug 2008 07:02:13 GMT]]></title><description><![CDATA[<p>naja schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>gloebl schrieb:</p>
<blockquote>
<p>...Laden/Speichern aus einer Binärdatei ...</p>
</blockquote>
<p>.. besser lassen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
(Habe keine Lust, zum 100ten Mal dasselbe zu schreiben ... mal sehen, ob ich auf die Schnelle den Link finde)</p>
</blockquote>
<p>Im prinzip ist binäres Speichern nicht schwerer als nur als Text zu speichern. Wird auch fast überall gemacht, z.B. alle möglichen Header von Bildern, Videos, Musik und die Daten dazu sind sogut wie immer binär, ZIP usw. Text braucht man nur, wenn es Menschen lesen können sollen.</p>
</blockquote>
<p>Wir reden offensichtlich von verschiedenen Dingen.<br />
1.) Ich sprach nicht prinzipiell davon, Daten binär abzuspeichern, sondern <em>direkt C++-Typen</em> binär abzuspeichern.<br />
2.) Mein Gegenargument war auch nicht, dass dies &quot;...schwer...&quot; sei (im Gegenteil: Es scheint offenbar so &quot;einfach&quot; zu sein, dass scheinbar jeder das erstmal für eine gute Idee hält). Da Problem, das mir am gravierendsten erscheint, ist die &quot;Unspezifiziertheit&quot; (und damit verbundene Inkompatibilität) des Objektdesigns.<br />
Oder kurz gesagt: Anderer Compiler, andere Compilerversion, andere Compileroptionen, andere Plattform, andere .... =&gt; alle Datenfiles fratze!</p>
<p>Es gibt noch andere gute Gründe, vom compilerspezifischen Objektdesign zu abstrahieren (sei es nun in ein &quot;menschenlesbares&quot; Protokoll oder ein anderes), aber schon der o.g. überwiegt in 99% der Fälle die Vorteile einer direkten Binärspeicherung.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570796</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 25 Aug 2008 07:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to Objektorientiertes Laden&#x2F;Speichern aus Binärdateien on Mon, 25 Aug 2008 07:26:51 GMT]]></title><description><![CDATA[<p>gloebl schrieb:</p>
<blockquote>
<p>...Das löst aber nicht mein Problem, dass ich nicht weiß welche Klasse ich beim Laden erzeugen muss...</p>
</blockquote>
<p>Mit reinem Standard-C++ wird Dir letztlich nichts Anderes übrig bleiben. Das ist aber auch so nicht so ungewöhlich: Wenn ich Dir jetzt irgendeine Binärdatei names &quot;a876fh&quot; in die Hand drücke, wirst Du auch immense Probleme haben, rauszubekommen, was ich Dir da mitteilen möchte... <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 />
Viele Programme bauen deshalb &quot;Kennzeichen&quot; in ihr &quot;Protokoll&quot; (so nenne ich das Format, in dem Daten abgespeichert werden), anhand derer sie feststellen können, ob sie den Inhalt &quot;verstehen&quot; können oder nicht...und genau sowas sind eben &quot;Typkennzeichen&quot;.<br />
Was mir noch einfällt: Du kannst natürlich alle Objekte eines Typs in eine eigene Datei ablegen. Dann hast Du Dein Typkennzeichen einfach in den Dateinamen verlegt.</p>
<p>EDIT: Hier der Link, den ich gesucht habe: <a href="http://www.parashift.com/c++-faq-lite/serialization.html" rel="nofollow">C++-FAQ-Lite: Serialization and Unserialization</a></p>
<p>gloebl schrieb:</p>
<blockquote>
<p>...<br />
Es scheint auch so zu sein, dass beim Serialisieren jede Klasse ihren eigenen Speichern-/Laden-Code mitbringen muss.<br />
Wenn ich daran denke, dass ich jeder speicherbaren Klasse noch sowas verpassen muss wird mir ganz anders...</p>
</blockquote>
<p>Schlechte Nachricht: Objektserialisierung ist nunmal ein komplexes Geschäft. Wenn Du das bislang vor Dir hergeschoben hast, wird's jetzt natürlich ein wenig mehr als wenn Du das gleich &quot;mitgemacht&quot; hättest.<br />
Gute Nachricht: Eigentlich ist das gar nicht soooo komplex. Ich habe boost::serialize noch nicht genutzt, sondern mache das immer mit den ganz normalen operator&lt;&lt;() und operator&gt;&gt;() (Vorteil IMHO: Damit kann ich sowieso jederzeit meine Objekte ausgeben(einlesen ... sei es nun in/aus Datei oder in/aus der Konsole (cout/cin).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1570809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1570809</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 25 Aug 2008 07:26:51 GMT</pubDate></item></channel></rss>