<?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[Gleiche Funktion zum schreiben und lesen in Stream]]></title><description><![CDATA[<p>Hi,</p>
<p>ich muss für mein Netzwerkprotokoll die Daten immer wieder in einen buffer (char array) packen und auf der anderen Seite wieder daraus auslesen, etwa so:</p>
<p><strong>Pseudo Code:</strong></p>
<pre><code>void send(char *buffer, int var1, long var2, char var3, int var4)
{
istringstream stream;
// [Makierung]
stream &lt;&lt; var1 &lt;&lt; &quot;,&quot;;
stream &lt;&lt; var2 &lt;&lt; &quot;,&quot;;
stream &lt;&lt; var3 &lt;&lt; &quot;,&quot;;
stream &lt;&lt; var4 &lt;&lt; &quot;,&quot;;
// [/Makierung]
buffer = stream.c_str();
}

void receive(char *buffer, int *var1, long *var2, char *var3, int *var4)
{
char c = 0; // Platzhalter für &quot;,&quot;
istringstream stream(buffer);
// [Makierung]
stream &gt;&gt; *var1 &gt;&gt; c;
stream &gt;&gt; *var2 &gt;&gt; c;
stream &gt;&gt; *var3 &gt;&gt; c;
stream &gt;&gt; *var4 &gt;&gt; c;
// [/Makierung]
}
</code></pre>
<p>So ist das ganze mal vereinfach ausgedrückt.</p>
<p>Frage:<br />
Wie kann ich die beiden Funktionen zu einer einzigen Funktion zusammenfassen?<br />
Insbesondere stört mich der makierte Teil, den ich gerne durch eine gemeinsame Funktion ersetzen würde.</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269604/gleiche-funktion-zum-schreiben-und-lesen-in-stream</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 08:09:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269604.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Jun 2010 11:18:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 11:18:46 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich muss für mein Netzwerkprotokoll die Daten immer wieder in einen buffer (char array) packen und auf der anderen Seite wieder daraus auslesen, etwa so:</p>
<p><strong>Pseudo Code:</strong></p>
<pre><code>void send(char *buffer, int var1, long var2, char var3, int var4)
{
istringstream stream;
// [Makierung]
stream &lt;&lt; var1 &lt;&lt; &quot;,&quot;;
stream &lt;&lt; var2 &lt;&lt; &quot;,&quot;;
stream &lt;&lt; var3 &lt;&lt; &quot;,&quot;;
stream &lt;&lt; var4 &lt;&lt; &quot;,&quot;;
// [/Makierung]
buffer = stream.c_str();
}

void receive(char *buffer, int *var1, long *var2, char *var3, int *var4)
{
char c = 0; // Platzhalter für &quot;,&quot;
istringstream stream(buffer);
// [Makierung]
stream &gt;&gt; *var1 &gt;&gt; c;
stream &gt;&gt; *var2 &gt;&gt; c;
stream &gt;&gt; *var3 &gt;&gt; c;
stream &gt;&gt; *var4 &gt;&gt; c;
// [/Makierung]
}
</code></pre>
<p>So ist das ganze mal vereinfach ausgedrückt.</p>
<p>Frage:<br />
Wie kann ich die beiden Funktionen zu einer einzigen Funktion zusammenfassen?<br />
Insbesondere stört mich der makierte Teil, den ich gerne durch eine gemeinsame Funktion ersetzen würde.</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918330</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Mon, 28 Jun 2010 11:18:46 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 11:43:26 GMT]]></title><description><![CDATA[<p>1. das ist keine spiele/graphik frage<br />
2. normalerweise macht man das so</p>
<pre><code class="language-cpp">void Serialize(Serializer&amp; rSerializer)
{
  rSerializer.Data(myVar1);
  rSerializer.Data(myVar2);
  rSerializer.Data(myVar3);
  rSerializer.Data(myVar4);
}

void send(char *buffer)
{
  Writer W;
  Serialize(W);
  buffer = W.c_str();
}

void receive(char *buffer)
{
  Reader R(buffer);
  Serialize(R);
}
</code></pre>
<ol start="3">
<li></li>
</ol>
<p>noch besser waere es wenn du einfach beim initializieren der objekte in einen generischen container z.b.</p>
<pre><code class="language-cpp">typedef std::vector&lt;std::pair&lt;void*,size_t&gt; &gt; PropertyVec;
</code></pre>
<p>regestrierst z.b.</p>
<pre><code class="language-cpp">CMyAuto::CMyAuto()
{
 m_PropertyVec.push_back(&amp;m_Color,sizeof(m_Color));
 m_PropertyVec.push_back(&amp;m_HP,sizeof(m_HP));
 m_PropertyVec.push_back(&amp;m_TopSpeed,sizeof(m_TopSpeed));
}
</code></pre>
<p>und beim serialisieren dann nur</p>
<pre><code class="language-cpp">for(iterator it=m_ProperyVec.begin()...
  rSerializer.Data(it-&gt;first,it-&gt;second);
</code></pre>
<p>so kannst du eine basisklasse zum serialisieren haben und alle anderen leiten nur davon ab und regestrieren ihre eigenschaften.</p>
<p>falls mal eine klasse komplexer ist (z.b. dynamische vectoren enthaelt) kannst du immer noch die interface funktion ueberladen und es entsprechend handlen.</p>
<ol start="4">
<li></li>
</ol>
<p>natuerlich geht es noch besser.<br />
- du kannst xml verwenden und so flexibilitaet beim format haben</p>
<pre><code class="language-cpp">void Serialize(Serializer&amp; rSerializer)
{
  rSerializer.Data(&quot;Color&quot;,myVar1);
  rSerializer.Data(&quot;HP&quot;,myVar2);
  rSerializer.Data(&quot;Speed&quot;,myVar3);
  rSerializer.Data(&quot;Aschebaeschecounter&quot;,myVar4);
}
</code></pre>
<p>-alle typen bis zum atomaren/primivite kapselt und jedem sein &quot;Serialize&quot; geben</p>
<p>etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918348</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Mon, 28 Jun 2010 11:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 11:44:01 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-5577.html" rel="nofollow">rapso</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-7.html" rel="nofollow">Spiele-/Grafikprogrammierung</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918350</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 28 Jun 2010 11:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 12:00:00 GMT]]></title><description><![CDATA[<p>Die Serialize Funktion muss ich aber doch auch selbst schreiben oder?</p>
<p>Gibt es das nicht schon vorgekaut? Dachte das währe ein &quot;Standardproblem&quot;?</p>
<p>Edit:<br />
Hab gerade die CMap Klasse entdeckt...<br />
Google behauptet zwar das das was mit Serialize zu tun hat aber ich bekomm keinen Durchblick...<br />
Kann mir jemand mit der Serialisation weiterhelfen?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918358</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Mon, 28 Jun 2010 12:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 12:11:03 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<p>Die Serialize Funktion muss ich aber doch auch selbst schreiben oder?</p>
<p>Gibt es das nicht schon vorgekaut? Dachte das währe ein &quot;Standardproblem&quot;?</p>
</blockquote>
<p>Da C++ keine Reflection hat, musst du die einzelnen Member manuell serialisieren. Es gibt nämlich keine Möglichkeit, von einem Objekt die Eigenschaften zu serialisieren, ohne diese zu kennen.</p>
<p>Allerdings helfen dir Bibliotheken wie <em>Boost.Serialization</em> enorm bei dieser Aufgabe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918363</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 28 Jun 2010 12:11:03 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 12:23:15 GMT]]></title><description><![CDATA[<p>Also brauche ich für jedes Objekt das ich serialisieren möchte eine eigene Funktion?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918371</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Mon, 28 Jun 2010 12:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 12:33:19 GMT]]></title><description><![CDATA[<p>Für eigene Objekte, ja. Dinge wie <code>int</code> oder <code>std::vector</code> sind schon implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918376</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 28 Jun 2010 12:33:19 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 12:43:42 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Für eigene Objekte, ja. Dinge wie <code>int</code> oder <code>std::vector</code> sind schon implementiert.</p>
</blockquote>
<p>Wo bzw. in welcher Funktion sind diese schon implementiert?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918386</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Mon, 28 Jun 2010 12:43:42 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 12:45:59 GMT]]></title><description><![CDATA[<p>In der Implementierung von <em>Boost.Serialization</em>. Wo genau, weiss ich nicht, das ist aber auch unwichtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918388</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 28 Jun 2010 12:45:59 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 15:43:47 GMT]]></title><description><![CDATA[<p>Kann ich den Operator nicht zur Laufzeit überladen?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918501</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Mon, 28 Jun 2010 15:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 15:48:30 GMT]]></title><description><![CDATA[<p>Drück dich klarer aus. Von welchem Operator sprichst du? Warum willst du diesen überladen? Und wieso erst zur Laufzeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918505</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 28 Jun 2010 15:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 28 Jun 2010 15:53:10 GMT]]></title><description><![CDATA[<p>Mal so eingeworfen: Gibts dazu noch keinen Artikel? Zu boost::serialization? Wäre was tolles :). Sorry für offtopic.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918507</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 28 Jun 2010 15:53:10 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 12 Jul 2010 18:39:25 GMT]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>ich hab mir jetzt einfach eine neu Klasse erstellt, die einen stringstream kapselt und die beiden Operatoren &gt;&gt; &lt;&lt; hat. Bei &lt;&lt; wird halt immer noch ein Trennzeichen mit in den String geschrieben und bei &gt;&gt; wird das Trennzeichen in eine Variable ausgelesen, aber sonst nicht weiter beachtet.</p>
<p>Danke für euere Hilfe.</p>
<p>Ich würde gerne Netzwerkpakete definieren, für die ich beispielsweise eine extra Klasse oder ein Struct anlege, sodass ich bei gemeinsamer Verwendung auf der Client und der Server Seite immer die gleichen Pakete habe.<br />
Was ich bisher weiß ist, dass ich dann für jedes Paket eine eigene serialize() Funktion schreiben müsste in der nur wieder alle Variablen der Klasse aufgelistet sind und die dann hintereinanderweg in einen stringstream geschrieben werden. Gibt es eine Möglichkeit diesen Schritt zu umgehen, dass die Klasse selbsttätig alle ihre Member in einen stream schreibt, oder andere Methoden, oder Ideen?</p>
<p>MfG<br />
Scarabol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925220</guid><dc:creator><![CDATA[Scarabol]]></dc:creator><pubDate>Mon, 12 Jul 2010 18:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to Gleiche Funktion zum schreiben und lesen in Stream on Mon, 12 Jul 2010 18:54:53 GMT]]></title><description><![CDATA[<p>Scarabol schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void send(char *buffer, int var1, long var2, char var3, int var4)
{
istringstream stream;
// [Makierung]
stream &lt;&lt; var1 &lt;&lt; &quot;,&quot;;
stream &lt;&lt; var2 &lt;&lt; &quot;,&quot;;
stream &lt;&lt; var3 &lt;&lt; &quot;,&quot;;
stream &lt;&lt; var4 &lt;&lt; &quot;,&quot;;
// [/Makierung]
buffer = stream.c_str();
}
</code></pre>
</blockquote>
<p>Also diese Funktion macht ja mal so gar nicht, was du willst. Zuerst mal hat ein istringstream keinen operator&lt;&lt;, du willst einen ostringstream oder einfach einen stringstream. Dann hat stringstream keine Methode c_str(), sondern nur str(), also willst du eher ein stream.str().c_str() (das kann man unter die Kategorie Pseudocode fallen lassen). Das funktioniert aber auch nicht, weil c_str() einen const char* zurückgibt, keinen char*. Selbst wenn diese Zuweisung klappen würde, würde der Code immer noch nicht das von dir gewünschte Verhalten zeigen, weil du den Zeiger buffer per value und nicht per reference überweist, d. h. von der letzten Zuweisung bekommt außerhalb der Funktion keiner was mit. Selbst wenn du den Zeiger per reference übergeben würdest, wäre das Verhalten des Codes höchstwahrscheinlich undefiniert, weil stream beim Verlassen der Funktion zerstört wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925231</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 12 Jul 2010 18:54:53 GMT</pubDate></item></channel></rss>