<?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[Strukturen speichern&#x2F;senden]]></title><description><![CDATA[<p>Hi, ich verwende diesen Code, um Strukturen zu speichern/senden:</p>
<pre><code class="language-cpp">DWORD WINAPI ThreadFuncGetBroadcast() 
{ 

	while(1)
	{

		char *t=new char[100];

	//	rc=recvfrom(ServerSockListenBR,t,100,0, (struct sockaddr *) &amp;AddrServer, &amp;size);

		//if(rc != -1 &amp;&amp; StrComp(GameName,t)) //SendBroadcast
		{
			_Broadcast* s1Struct1=new _Broadcast;

			sprintf_s(s1Struct1-&gt;GameName,GameName);
			dat* s2Struct1=new dat;
			s2Struct1-&gt;k=0;

			sprintf_s(s2Struct1-&gt;mes,&quot;HALLOOOO!!!&quot;);

			s1Struct1-&gt;Rest=(char*)s2Struct1;

			sendto(ClientSockSend,(char*)s1Struct1,sizeof(_Broadcast)+sizeof(dat),0, (struct sockaddr *) &amp;AddrClient, sizeof(AddrClient));

			FILE*f=fopen(&quot;c:\\delta.txt&quot;,&quot;wb&quot;);
			fwrite((char*)s1Struct1,sizeof(_Broadcast)+sizeof(dat),1,f);
			fclose(f);

			delete s2Struct1;
			delete s1Struct1;
		}
		delete t;

	}

   return NULL; 
}
</code></pre>
<p>Seltsamerweise geht es nur, wenn ich statt &quot;c:\\delta.txt&quot; &quot;c:\\delta3.txt&quot; schreibe...</p>
<p>CLR ändert auch (manchmal) das Verhalten...</p>
<p>Hiermit werden die Strukturen geladen:</p>
<pre><code class="language-cpp">s1Struct2=new _Broadcast;
    s2Struct2=new dat;
    s1Struct2-&gt;Rest=(char*)s2Struct2;
		rc=recvfrom(ServerSockListen,(char*)s1Struct2,sizeof(_Broadcast)+sizeof(dat),0, (struct sockaddr *) &amp;AddrServer, &amp;size);

    FILE*f=fopen(&quot;c:/delta.txt&quot;,&quot;rb&quot;);
    fread((char*)s1Struct2,sizeof(_Broadcast)+sizeof(dat),1,f);
    fclose(f);

    iprintf(s2Struct2-&gt;mes);
</code></pre>
<pre><code class="language-cpp">struct _Broadcast
{
	char HOST[128];
	char GameName[100];
	char* Rest;

};

struct dat
{
	int k;
	char mes[100];
};
</code></pre>
<p>Seht ihr vielleicht welche Speicherfehler ich mache und/oder wie ich verschachtelte Strukturen besser sende/speichere ?</p>
<p>Bin für jede Hilfe dankbar !</p>
<p>PS: Frohe Weihnachten :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257135/strukturen-speichern-senden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 14:51:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257135.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Dec 2009 14:29:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 14:29:45 GMT]]></title><description><![CDATA[<p>Hi, ich verwende diesen Code, um Strukturen zu speichern/senden:</p>
<pre><code class="language-cpp">DWORD WINAPI ThreadFuncGetBroadcast() 
{ 

	while(1)
	{

		char *t=new char[100];

	//	rc=recvfrom(ServerSockListenBR,t,100,0, (struct sockaddr *) &amp;AddrServer, &amp;size);

		//if(rc != -1 &amp;&amp; StrComp(GameName,t)) //SendBroadcast
		{
			_Broadcast* s1Struct1=new _Broadcast;

			sprintf_s(s1Struct1-&gt;GameName,GameName);
			dat* s2Struct1=new dat;
			s2Struct1-&gt;k=0;

			sprintf_s(s2Struct1-&gt;mes,&quot;HALLOOOO!!!&quot;);

			s1Struct1-&gt;Rest=(char*)s2Struct1;

			sendto(ClientSockSend,(char*)s1Struct1,sizeof(_Broadcast)+sizeof(dat),0, (struct sockaddr *) &amp;AddrClient, sizeof(AddrClient));

			FILE*f=fopen(&quot;c:\\delta.txt&quot;,&quot;wb&quot;);
			fwrite((char*)s1Struct1,sizeof(_Broadcast)+sizeof(dat),1,f);
			fclose(f);

			delete s2Struct1;
			delete s1Struct1;
		}
		delete t;

	}

   return NULL; 
}
</code></pre>
<p>Seltsamerweise geht es nur, wenn ich statt &quot;c:\\delta.txt&quot; &quot;c:\\delta3.txt&quot; schreibe...</p>
<p>CLR ändert auch (manchmal) das Verhalten...</p>
<p>Hiermit werden die Strukturen geladen:</p>
<pre><code class="language-cpp">s1Struct2=new _Broadcast;
    s2Struct2=new dat;
    s1Struct2-&gt;Rest=(char*)s2Struct2;
		rc=recvfrom(ServerSockListen,(char*)s1Struct2,sizeof(_Broadcast)+sizeof(dat),0, (struct sockaddr *) &amp;AddrServer, &amp;size);

    FILE*f=fopen(&quot;c:/delta.txt&quot;,&quot;rb&quot;);
    fread((char*)s1Struct2,sizeof(_Broadcast)+sizeof(dat),1,f);
    fclose(f);

    iprintf(s2Struct2-&gt;mes);
</code></pre>
<pre><code class="language-cpp">struct _Broadcast
{
	char HOST[128];
	char GameName[100];
	char* Rest;

};

struct dat
{
	int k;
	char mes[100];
};
</code></pre>
<p>Seht ihr vielleicht welche Speicherfehler ich mache und/oder wie ich verschachtelte Strukturen besser sende/speichere ?</p>
<p>Bin für jede Hilfe dankbar !</p>
<p>PS: Frohe Weihnachten :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826797</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 14:29:45 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 16:29:20 GMT]]></title><description><![CDATA[<p>Sorry DarkShadow44,</p>
<p>aber an deinem Code ist (fast) alles falsch...</p>
<pre><code class="language-cpp">s1Struct1-&gt;Rest=(char*)s2Struct1;

sizeof(_Broadcast)+sizeof(dat)
</code></pre>
<p>Diese beiden Zeilen passen überhaupt nicht zueinander!<br />
Beim Empfangen hast du dann denselben Fehler.</p>
<p>Du mußt entweder die 2. Struktur als Unterstruktur der ersten anlegen oder aber die beiden Strukturen einzeln verschicken.</p>
<p>Und warum reservierst du lokale Strukturen mittels new auf dem Heap (hast du vorher Java programmiert?)?</p>
<p>Trotzdem frohe Weihnachten :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826876</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 23 Dec 2009 16:29:20 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 16:37:01 GMT]]></title><description><![CDATA[<p>Die Strukturen werden befüllt, dann wird ein Pointer der 1.Struct auf die 2.Struct gesetzt.</p>
<p>Danach wird, wenn die 1.Struct gesendet wird, auch die 2.Struct gesendet.<br />
Zusammen haben sie die Größe &quot;sizeof(struct1)+(sizeof(struct2)&quot; .</p>
<p>Auf dem Heap liegen sie, da ohne das die 2.Struct gar nicht empfangen wurde.<br />
Frag aber nicht warum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826882</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 16:37:01 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 16:42:23 GMT]]></title><description><![CDATA[<p>Serialisiert wird besser, indem du jeder serialisierbarer Klasse eine Funktion serialize/unserialize verpasst. Bei verschachtelten Strukturen kannst du dann wieder die entsprechenden Funktionen der Klassenelemente aufrufen.<br />
Geht auch recht komfortabel mit Boost.Serialization.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826886</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 23 Dec 2009 16:42:23 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 17:43:24 GMT]]></title><description><![CDATA[<p>Ich will aber möglichst wenige &quot;externe&quot; libs verwenden.</p>
<blockquote>
<p>Serialisiert wird besser, indem du jeder serialisierbarer Klasse eine Funktion serialize/unserialize verpasst.</p>
</blockquote>
<p>Verstehe ich nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826927</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 17:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 17:56:43 GMT]]></title><description><![CDATA[<p>boost ist quasi Standard.<br />
Ich meine, dass jeder deiner serialisierbaren Klassen diese Methoden implementieren sollen (wobei serialisieren letztendlich einfach &quot;in einen Stream/eine Datei schreiben&quot; heißt).<br />
Zum Beispiel so:</p>
<pre><code class="language-cpp">class Klasse
{
  public:
    void serialize(Stream&amp; stream,int version,uint flags)
    {
      stream.writeInt(v1);
      stream.writeInt(v2);
      stream.writeString(str);
    }

    void unserialize(Stream&amp; stream,int version,uint flags)
    {
      stream.readInt(v1);
      stream.readInt(v2);
      stream.readString(str);
    }

  private:
    int v1,v2;
    std::string str;
};
</code></pre>
<p>version und flags sind natürlich optional und können/sollten zusammen in eine Struktur wandern, damit du sie später bei Bedarf erweitern kannst.<br />
Stream ersetzt du durch deine bevorzugte Streamklasse, das können natürlich auch die Standard-C++-Streams sein. writeInt usw. ist dann dementsprechend passend zu ersetzen.<br />
Wie das ganze mit boost geht, steht in der Dokumentation:<br />
<a href="http://www.boost.org/doc/libs/1_41_0/libs/serialization/doc/index.html" rel="nofollow">http://www.boost.org/doc/libs/1_41_0/libs/serialization/doc/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826936</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 23 Dec 2009 17:56:43 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 18:00:13 GMT]]></title><description><![CDATA[<p>Aber ich will ja eine Bibliothek schreiben <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="😃"
    /></p>
<p>Deshalb muss der User eine Struktur übergeben können, die dann in eine spezielle Struktur (enthält IP/Hostname/...) gepackt wird, und dann gesendet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826937</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 18:00:13 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 18:04:46 GMT]]></title><description><![CDATA[<p>Ich weiß zwar nicht, was du genau meinst, aber alle serialisierbaren Klassen können z.B. von einer abstrakten Klasse Serializable erben. Dann kannst du übergebene Strukturen serialisieren lassen, ohne deren Details zu kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826941</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 23 Dec 2009 18:04:46 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 18:20:14 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Danach wird, wenn die 1.Struct gesendet wird, auch die 2.Struct gesendet.<br />
Zusammen haben sie die Größe &quot;sizeof(struct1)+(sizeof(struct2)&quot; .</p>
</blockquote>
<p>Nö, das ist nicht der Fall. Was gesendet wird, ist struct1 (inklusive dem Zeiger Rest, was nie Sinn machen kann) und sizeof(struct2) Bytes, die hinter s1Struct1 liegen. Und das ist bestimmt nicht deine zweite struct. Dass dir das nicht um die Ohren fliegt, ist reine Glückssache.</p>
<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Auf dem Heap liegen sie, da ohne das die 2.Struct gar nicht empfangen wurde.<br />
Frag aber nicht warum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
</blockquote>
<p>Wenn du ungültige Speicherzugriffe im Programm hast, brauchst du dich über eigenartiges Verhalten nicht wundern. Mach new und delete wieder weg. Müsste sowieso delete[] t heißen.<br />
Außerdem: was ist denn sprintf_s für wüstes Zeug? Hab ich ja noch nie gehört und hat mit C++ auch nicht mehr viel zu tun. Und warum char-Arrays statt std::string? Wieso fopen usw. statt file streams?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826949</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 23 Dec 2009 18:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 18:30:49 GMT]]></title><description><![CDATA[<p>Die Strukturen wurden aber schon korrekt gesendet....<br />
Oder war das nur Zufall und weil Server und Client auf dem selben Rechner liegen ?</p>
<p>Wie würdest du denn eine Struktur übergeben lassen, von der der Inhalt unbekannt ist ? Ich habe sie halt asl &quot;char*&quot; und Länge übergeben.</p>
<p>Ich meine:</p>
<pre><code class="language-cpp">InitNetwork(????? dataStrukt,int size)
{
}
</code></pre>
<p>sprintf_s schreibt Text in einen buffer.</p>
<blockquote>
<p>Und warum char-Arrays statt std::string? Wieso fopen usw. statt file streams?</p>
</blockquote>
<p>Ich habe eher mit C angefangen, deshalb verwende ich solche Sachen häufiger <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826953</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 18:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 18:55:48 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Die Strukturen wurden aber schon korrekt gesendet....<br />
Oder war das nur Zufall und weil Server und Client auf dem selben Rechner liegen ?</p>
</blockquote>
<p>Dass zwei direkt nacheinander mit new erzeuge Objekte direkt hintereinander liegen, ist nicht ganz abwegig, aber reiner Zufall.</p>
<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Wie würdest du denn eine Struktur übergeben lassen, von der der Inhalt unbekannt ist ? Ich habe sie halt asl &quot;char*&quot; und Länge übergeben.</p>
<p>Ich meine:</p>
<pre><code class="language-cpp">InitNetwork(????? dataStrukt,int size)
{
}
</code></pre>
</blockquote>
<p>Wie schon gesagt, du hast eine abstrakte Klasse Serializable:</p>
<pre><code class="language-cpp">class Serializable
{
  public:
    virtual void serialize(Stream&amp; stream,...)=0;
    virtual void unserialize(Stream&amp; stream,...)=0;
};
</code></pre>
<p>... von der alle serialisierbaren Klassen erben.<br />
Irgendeine serialisierbare Klasse kannst du dann also mit InitNetwork(const Serializable&amp; dataStrukt) übergeben. Natürlich kannst du auch einen fertigen Stream oder Buffer übergeben, in dem die gewünschte(n) Struktur(en) schon fertig serialisiert sind.<br />
Um serialize &amp; Co. kommst du nicht herum, da mit char-Casterei grundsätzlich keine Strukturen mit Zeigern (ob direkt oder indirekt durch Container-Objekte wie string und vector) serialisiert werden können. Und ohne Zeiger kommst du nicht mal bis vor die Haustür, geschweige denn irgendwo hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826960</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 23 Dec 2009 18:55:48 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 19:03:49 GMT]]></title><description><![CDATA[<p>ich möchte aber nur eine einfache struct übergeben:</p>
<pre><code class="language-cpp">struct _data
{
    char name[20];
    int Typ;
    char Message[100];
};

_data data;

void main()
{
    /*.....*/
    InitNetwork(data,sizeof(_data));
    /*.....*/
}
</code></pre>
<p>Ist das so nicht machbar ?</p>
<blockquote>
<p>Um serialize &amp; Co. kommst du nicht herum, da mit char-Casterei grundsätzlich keine Strukturen mit Zeigern (ob direkt oder indirekt durch Container-Objekte wie string und vector) serialisiert werden können.</p>
</blockquote>
<p>Ich habe die Strukturen so schon erfolgreich in Textdateien geschrieben und geladen (Siehe Threadanfang)</p>
<p>Du meinst also, das sinnvollste und einfachste wäre, den User ein Interface &quot;ISerialize&quot; verwenden zu lassen ?<br />
Und den Stream + seine Länge übergeben ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826965</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 19:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 19:13:56 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>...<br />
Ist das so nicht machbar ?</p>
</blockquote>
<p>Klar ist das machbar... ich weiß aber auch nicht, was du erreichen willst.<br />
Aller Wahrscheinlichkeit nach willst du ja immer denselben Strukturtyp übergeben. Dann nimmt InitNetwork diesen eben als Argument und size brauchst du dann auch nicht mehr.</p>
<blockquote>
<p>Ich habe die Strukturen so schon erfolgreich in Textdateien geschrieben und geladen (Siehe Threadanfang)</p>
</blockquote>
<p>Wie schon erwähnt, ist das so nicht möglich und war bisher nur Glück. Und du bist ja auch noch gar nicht vor deiner Haustür angelangt <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 />
Du kannst ohne Zeiger keine Listen und sonstige Strukturen variabler Größe serialisieren.</p>
<blockquote>
<p>Du meinst also, das sinnvollste und einfachste wäre, den User ein Interface &quot;ISerialize&quot; verwenden zu lassen ?</p>
</blockquote>
<p>Kommt auf den Fall drauf an... generell ja, wenn du irgendwelche Funktionen hast, die beliebige Strukturen serialisieren können sollen. Sowas hat man aber eher selten.</p>
<blockquote>
<p>Und den Stream + seine Länge übergeben ?</p>
</blockquote>
<p>Ein Stream kennt seine Länge, die musst du also nicht extra übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826972</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 23 Dec 2009 19:13:56 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 19:25:34 GMT]]></title><description><![CDATA[<blockquote>
<p>Aller Wahrscheinlichkeit nach willst du ja immer denselben Strukturtyp übergeben.</p>
</blockquote>
<p>Ich will eine lib erstellen. Der User soll eine beliebige struct übergeben können, die dann gesendet und empfangen wird.</p>
<blockquote>
<p>Du kannst ohne Zeiger keine Listen und sonstige Strukturen variabler Größe serialisieren.</p>
</blockquote>
<p>Aber eigentlich sollte das doch &quot;erlaubt&quot; sein:</p>
<pre><code class="language-cpp">_data data1;
char*buffer=(char*)&amp;data1;
char*buffer2=new char[sizeof(_data)];
//copy buffer to buffer2
_data*data2=(_data*)buffer2;
</code></pre>
<p>Ich bin mir ganz sicher, dass sich Strukturen so verbiegen lassen.<br />
Hat bisher (auch über Netzwerk (!) ) wunderbar geklappt.</p>
<blockquote>
<p>Kommt auf den Fall drauf an... generell ja, wenn du irgendwelche Funktionen hast, die beliebige Strukturen serialisieren können sollen. Sowas hat man aber eher selten.</p>
</blockquote>
<p>Die soll der User meiner lib ja implementieren <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>
<p>Sorry für die blöde Frage, aber sind Streams char-Pointern nicht sehr ähnlich ? <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="😕"
    /><br />
Wie soll ich denn eine Struct/int/array in einen Stream schreiben ?</p>
<p>Irgendwie finde ich nur I/O - streams zum Lesen/Schreiben auf der Festplatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826978</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 19:25:34 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 19:59:14 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Ich will eine lib erstellen. Der User soll eine beliebige struct übergeben können, die dann gesendet und empfangen wird.</p>
</blockquote>
<p>Dann würde ich ein Buffer/Stream übergeben. Ich als Benutzer hätte jedenfalls keine Lust, extra ein paar Strukturen in einer neuen Klasse zu kapseln, wenn ich mehrere davon versenden will.</p>
<blockquote>
<p>Aber eigentlich sollte das doch &quot;erlaubt&quot; sein:</p>
<pre><code class="language-cpp">_data data1;
char*buffer=(char*)&amp;data1;
char*buffer2=new char[sizeof(_data)];
//copy buffer to buffer2
_data*data2=(_data*)buffer2;
</code></pre>
<p>Ich bin mir ganz sicher, dass sich Strukturen so verbiegen lassen.<br />
Hat bisher (auch über Netzwerk (!) ) wunderbar geklappt.</p>
</blockquote>
<p>Öh, &quot;erlaubt&quot; ist das, aber das hat nichts mit dem angesprochenen Problem zu tun. Kopiert wird hier allerdings nichts. data2 zeigt jetzt auf uninitialisierten (!) Speicher, der zwar groß genug für ein _data-Objekt ist, aber ein solches wurde dort nicht konstruiert. Falls du mit dem Kommentar meintest, dass hier noch kopiert werden müsste: das geht nur für PODs, in der Regel geht das aber nicht. Insbesondere wenn du Zeiger kopierst, fliegen dir die Destruktoren danach kräftig um die Ohren.</p>
<blockquote>
<p>Sorry für die blöde Frage, aber sind Streams char-Pointern nicht sehr ähnlich ? <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="😕"
    /></p>
</blockquote>
<p>Nein, Streams abstrahieren das ganze. Ein Stream, der seine Daten im Speicher hält, verwendet intern höchstwahrscheinlich ein Array, aber der Punkt ist, dass der Stream die Daten, die du ihm gibst, auch direkt auf die Festplatte in eine Datei schicken kann oder gleich übers Netzwerk verschicken kann. All das, ohne dass deine Funktionen sich darum kümmern müssen, was der Stream genau macht. Außerdem kümmert er sich automatisch darum, dass immer genug Platz für die Daten vorhanden ist.</p>
<blockquote>
<p>Wie soll ich denn eine Struct/int/array in einen Stream schreiben ?</p>
</blockquote>
<p>Kommt drauf an... mit den Standardstreams so:</p>
<pre><code class="language-cpp">deinStream &lt;&lt; deineStruct &lt;&lt; deinInt; //erfordert, dass du &lt;&lt; für deine Klasse überlädst
//oder:
deineStruct.serialize(deinStream); //erfordert, dass du serialize implementierst
//Arrays gehen natürlich genauso, nur dass du eben jedes Element serialisierst und vorher die Länge in den Stream schreibst.
//Sinnvollerweise kapselt man das irgendwo in einer Klasse oder Streamfunktion.
</code></pre>
<p>Mit Boost.Serialize dann &amp; statt &lt;&lt;.<br />
Bei anderen Streanklassen rufst du eben die passenden Funktionen auf. Bei mir z.B. wären das write, writeString etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826990</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 23 Dec 2009 19:59:14 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 20:11:44 GMT]]></title><description><![CDATA[<blockquote>
<p>Dann würde ich ein Buffer/Stream übergeben. Ich als Benutzer hätte jedenfalls keine Lust, extra ein paar Strukturen in einer neuen Klasse zu kapseln, wenn ich mehrere davon versenden will.</p>
</blockquote>
<p>Ich hätte das in-Stream-Umwandeln dem Benutzer halt gerne abgenommen...<br />
Nochmal, MUSS das dem Benutzer überlassen werden ?</p>
<p>Was sind &quot;PODs&quot; ?</p>
<p>Und wo überlade ich den Operator z.B. für eine struct ?<br />
Und wie geht das bei einer struct ?</p>
<p>Was mache ich dann, wenn ich einen String unbekannter Länge mit einen Stream empfange ?</p>
<p>Wäre halt toll, wenn das Ganze so vereinfacht würde, dass der Benutzer einen char-Pointer auf die struct übergibt und ich die versende(natürlich in MEINER struct ^^.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826998</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 20:11:44 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 20:57:16 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Was sind &quot;PODs&quot; ?</p>
</blockquote>
<p><a href="http://en.wikipedia.org/wiki/Plain_old_data_structures" rel="nofollow">http://en.wikipedia.org/wiki/Plain_old_data_structures</a></p>
<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Und wo überlade ich den Operator z.B. für eine struct ?<br />
Und wie geht das bei einer struct ?</p>
</blockquote>
<p><a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29" rel="nofollow">http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29</a></p>
<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Was mache ich dann, wenn ich einen String unbekannter Länge mit einen Stream empfange ?</p>
</blockquote>
<p>Ein String hat eine bekannte Länge.</p>
<p>Aber womit lernst du eigentlich C++? Solche Grundlagen sollten in jedem brauchbaren Anfängerbuch stehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827023</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 23 Dec 2009 20:57:16 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 21:53:21 GMT]]></title><description><![CDATA[<p>Sorry, ich habe string grade wieder mit char-Pointer verwechselt.</p>
<p>Ein String hat nicht immer eine bekannte Länge, ich meine es macht einen Unterschied ob ich einen 120-char oder einen 10-char String sende...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827034</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 21:53:21 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 22:11:24 GMT]]></title><description><![CDATA[<p>Entweder die Länge vorher angeben oder den String durch \0 terminieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827047</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Wed, 23 Dec 2009 22:11:24 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 22:15:06 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Ein String hat nicht immer eine bekannte Länge, ich meine es macht einen Unterschied ob ich einen 120-char oder einen 10-char String sende...</p>
</blockquote>
<p>Unter String versteht man in C++ zunächst zwei Dinge:</p>
<ul>
<li>Nullterminiertes <code>char</code> -Array. Die Nullterminierung bestimmt die Länge.</li>
<li>Instanz von <code>std::string</code> . Die Methode <code>size()</code> gibt über die Länge Auskunft.</li>
</ul>
<p>Allerdings ist nicht jedes <code>char</code> -Array ein C-String.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827048</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 23 Dec 2009 22:15:06 GMT</pubDate></item><item><title><![CDATA[Reply to Strukturen speichern&#x2F;senden on Wed, 23 Dec 2009 22:32:18 GMT]]></title><description><![CDATA[<p>Danke schonmal <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="😃"
    /></p>
<p>Ich speichere die einzelnen Werte jetzt mit '\0' terminiert als Textdatei.<br />
Damit lade ich sie:</p>
<pre><code class="language-cpp">ifstream sss;
			sss.open (&quot;c:/delta.txt&quot;,ios::in);

			string line;

			if (sss.is_open())
			{
				while (! sss.eof() )
				{
					getline (sss,line);
					cout &lt;&lt; line &lt;&lt; endl;
				}
				sss.close();
			}
</code></pre>
<p>Dadurch bricht die Schleife beim ersten '\0' ab. Wie finde ich den raus, wie lang die Textdatei ist ?<br />
Die Methode &quot;length()&quot; gibt's ja bei &quot;ifstream&quot; nicht, genauso wenig wie &quot;str()&quot; .</p>
<p>Beim senden stellt das kein Problem dar, da die Länge mitgeliefert wird, aber wie finde ich raus die &quot;Position&quot; im Stream raus ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1827053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1827053</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 23 Dec 2009 22:32:18 GMT</pubDate></item></channel></rss>