<?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[String wird falsch aus Datei gelesen (Binär)]]></title><description><![CDATA[<p>Um Variablen in eine Datei zu speichern bzw. auszulesen habe ich folgende Klasse geschrieben:</p>
<pre><code>#include &lt;fstream&gt;

class BinaryFile
{
	std::fstream m_file;

//...

	template&lt;class T&gt;
	void WriteValue(T value)
	{
		m_file.write((const char*)(&amp;value), sizeof(T));
	}

	void WriteValue(std::string value)
	{
		WriteValue(value.size());
		m_file.write((const char*)(value.c_str()), value.size() * sizeof(char));
	}

	template&lt;class T&gt;
	void ReadValue(T&amp; value)
	{
		char* temp = new char[sizeof(T)];
		m_file.read(temp, sizeof(T));
		value = (T)(*temp);
		delete temp;
	}

	void ReadValue(std::string&amp; value)
	{
		unsigned int chars = 0;
		ReadValue(chars);
		char* temp = new char[chars];
		m_file.read(temp, chars*sizeof(char));
		value = temp;
		delete temp;
	};

//...
};
</code></pre>
<p>Wenn ich jetzt folgenden Code ausführe:</p>
<pre><code>std::string tmpString = std::string(&quot;TestString&quot;);
	int i1 = 1;
	int i2 = 23;

	BinaryFile* bf = new BinaryFile(&quot;test.txt&quot;);
	bf-&gt;WriteValue(tmpString);
	bf-&gt;WriteValue(i1);
	bf-&gt;WriteValue(i2);
	delete bf;	

	BinaryFile* bf2 = new BinaryFile(&quot;test.txt&quot;);
	bf-&gt;ReadValue(tmpString);
	bf-&gt;ReadValue(i1);
	bf-&gt;ReadValue(i2);
	delete bf2;
</code></pre>
<p>Die Datei sieht in einem Hex-Editor nun so aus:<br />
[0a 00 00 00] [54 65 73 74 53 74 72 69 6e 67] [01 00 00 00] [17 00 00 00]</p>
<p>1. Block = 10 (Die Länge des Strings) (4 Byte int)<br />
2. Block = Bytecode für TestString (10x 1 Byte char)<br />
3. Block = 1 (4 Byte int)<br />
4. Block = 17 (4 Byte int)</p>
<p>Gespeichert wirds also richtig <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>
<p>Doch beim lesen passiert folgendes:<br />
1. Die Länge von 10 wird korrekt ausgelesen.<br />
2. tmpString = &quot;TestStringýýýý««««««««îþ&quot;, es werden also 24 Bytes gelesen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
3. i1 und i2 werden wieder korrekt ausgelesen (1 und 23)</p>
<p>Woher kommen also die zusätzlichen Bytes wenn er doch bei i1 und i2 wieder an der richtigen Stelle weiter liest??? <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>
<p>Anmerkung: Führt man dasselbe Programm mehrmals aus kommt es teilweise vor das bei bf-&gt;ReadValue(i1); eine Zugriffsverletzung angezeigt wird.</p>
<p>Kann mir da jemand sagen wo der Fehler liegt? Irgendwie blicke ich da nicht wirklich durch <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/topic/295442/string-wird-falsch-aus-datei-gelesen-binär</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 11:15:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295442.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Nov 2011 11:08:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 11:09:58 GMT]]></title><description><![CDATA[<p>Um Variablen in eine Datei zu speichern bzw. auszulesen habe ich folgende Klasse geschrieben:</p>
<pre><code>#include &lt;fstream&gt;

class BinaryFile
{
	std::fstream m_file;

//...

	template&lt;class T&gt;
	void WriteValue(T value)
	{
		m_file.write((const char*)(&amp;value), sizeof(T));
	}

	void WriteValue(std::string value)
	{
		WriteValue(value.size());
		m_file.write((const char*)(value.c_str()), value.size() * sizeof(char));
	}

	template&lt;class T&gt;
	void ReadValue(T&amp; value)
	{
		char* temp = new char[sizeof(T)];
		m_file.read(temp, sizeof(T));
		value = (T)(*temp);
		delete temp;
	}

	void ReadValue(std::string&amp; value)
	{
		unsigned int chars = 0;
		ReadValue(chars);
		char* temp = new char[chars];
		m_file.read(temp, chars*sizeof(char));
		value = temp;
		delete temp;
	};

//...
};
</code></pre>
<p>Wenn ich jetzt folgenden Code ausführe:</p>
<pre><code>std::string tmpString = std::string(&quot;TestString&quot;);
	int i1 = 1;
	int i2 = 23;

	BinaryFile* bf = new BinaryFile(&quot;test.txt&quot;);
	bf-&gt;WriteValue(tmpString);
	bf-&gt;WriteValue(i1);
	bf-&gt;WriteValue(i2);
	delete bf;	

	BinaryFile* bf2 = new BinaryFile(&quot;test.txt&quot;);
	bf-&gt;ReadValue(tmpString);
	bf-&gt;ReadValue(i1);
	bf-&gt;ReadValue(i2);
	delete bf2;
</code></pre>
<p>Die Datei sieht in einem Hex-Editor nun so aus:<br />
[0a 00 00 00] [54 65 73 74 53 74 72 69 6e 67] [01 00 00 00] [17 00 00 00]</p>
<p>1. Block = 10 (Die Länge des Strings) (4 Byte int)<br />
2. Block = Bytecode für TestString (10x 1 Byte char)<br />
3. Block = 1 (4 Byte int)<br />
4. Block = 17 (4 Byte int)</p>
<p>Gespeichert wirds also richtig <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>
<p>Doch beim lesen passiert folgendes:<br />
1. Die Länge von 10 wird korrekt ausgelesen.<br />
2. tmpString = &quot;TestStringýýýý««««««««îþ&quot;, es werden also 24 Bytes gelesen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
3. i1 und i2 werden wieder korrekt ausgelesen (1 und 23)</p>
<p>Woher kommen also die zusätzlichen Bytes wenn er doch bei i1 und i2 wieder an der richtigen Stelle weiter liest??? <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>
<p>Anmerkung: Führt man dasselbe Programm mehrmals aus kommt es teilweise vor das bei bf-&gt;ReadValue(i1); eine Zugriffsverletzung angezeigt wird.</p>
<p>Kann mir da jemand sagen wo der Fehler liegt? Irgendwie blicke ich da nicht wirklich durch <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/2144305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144305</guid><dc:creator><![CDATA[Rookie86]]></dc:creator><pubDate>Mon, 14 Nov 2011 11:09:58 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 11:16:23 GMT]]></title><description><![CDATA[<p>Du setzt beim einlesen kein '\0' ans ende deines Buffers, der std::string liest also bei der Zuweisung so lange im Speicher rum, bis er eins findet...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144312</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 14 Nov 2011 11:16:23 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 11:27:25 GMT]]></title><description><![CDATA[<p>Und das ganze new/delete Zeugs ist auch sehr hässlich, warum machst du das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144315</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 14 Nov 2011 11:27:25 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 12:25:32 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: danke genau das wars. mit \0 liesst er wirklich nur noch TestString ein <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>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25760">@cooky451</a>: ja ich weiss, nicht nur die new/delete sache, auch die ganzen Typkonvertierungen sind extrem hässlich :(. Aber irgendwie hab ich bis jetzt keine andere &quot;Lösung&quot; gefunden. Ich denke auch dass er mir genau deswegen immer wieder mal ne Zugriffsverletzung wirft. Hast du eine Idee wie man das ein bisschen schöner lösen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144341</guid><dc:creator><![CDATA[Rookie86]]></dc:creator><pubDate>Mon, 14 Nov 2011 12:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 12:27:50 GMT]]></title><description><![CDATA[<p>Rookie86 schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25760">@cooky451</a>: ja ich weiss, nicht nur die new/delete sache, auch die ganzen Typkonvertierungen sind extrem hässlich :(. Aber irgendwie hab ich bis jetzt keine andere &quot;Lösung&quot; gefunden. Ich denke auch dass er mir genau deswegen immer wieder mal ne Zugriffsverletzung wirft. Hast du eine Idee wie man das ein bisschen schöner lösen könnte?</p>
</blockquote>
<p>new[] bedeutet immer, dass man eigentlich std::vector (oder etwas vergleichbares) möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144343</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 Nov 2011 12:27:50 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 12:29:51 GMT]]></title><description><![CDATA[<p>Rookie86 schrieb:</p>
<blockquote>
<p>Hast du eine Idee wie man das ein bisschen schöner lösen könnte?</p>
</blockquote>
<p>Bei dem Puffer: Rohes Array / std::array / std::vector<br />
Bei dem BinaryFile:</p>
<pre><code class="language-cpp">class A
{
  void foo()
  {
  }
};
int main()
{
  A a; // Nichts, kein new
  a.foo();
} // Alles wird ganz normal aufgeräumt.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2144346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144346</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 14 Nov 2011 12:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 12:57:13 GMT]]></title><description><![CDATA[<p>Rookie86 schrieb:</p>
<blockquote>
<pre><code>class BinaryFile
{
	std::fstream m_file;

//...

	template&lt;class T&gt;
	void WriteValue(T value)
	{
		m_file.write((const char*)(&amp;value), sizeof(T));
	}
</code></pre>
</blockquote>
<p>Das halte ich für gefählich, da der Typ hier automatisch deduziert werden kann. Ich würde den Benutzer zwingen, den richtigen Typ anzugeben:</p>
<pre><code class="language-cpp">template&lt;class T&gt; struct id {typedef T type;};

:::

    template&lt;class T&gt;
    void WriteValue(typename id&lt;T&gt;::type value)
    ::::
</code></pre>
<p>Ein portables Dateiformat kommt dabei aber auch nicht heraus.</p>
<p>Rookie86 schrieb:</p>
<blockquote>
<pre><code>void WriteValue(std::string value)
	{
		WriteValue(value.size());
		m_file.write((const char*)(value.c_str()), value.size() * sizeof(char));
	}
</code></pre>
</blockquote>
<p>Tja, was liefert denn value.size() zurück -- vom TYP her?</p>
<p>Rookie86 schrieb:</p>
<blockquote>
<pre><code>template&lt;class T&gt;
	void ReadValue(T&amp; value)
	{
		char* temp = new char[sizeof(T)];
		m_file.read(temp, sizeof(T));
		value = (T)(*temp);
		delete temp;
	}
</code></pre>
</blockquote>
<p>Das delete passt nicht zum new[]. Es geht auch komplett ohne new[]/delete[]. Lass von new/delete und ganzbesonders new[]/delete[] einfach die Finger.</p>
<p>Rookie86 schrieb:</p>
<blockquote>
<pre><code>void ReadValue(std::string&amp; value)
	{
		unsigned int chars = 0;
		ReadValue(chars);
</code></pre>
</blockquote>
<p>Aha. Wer sagt denn, dass &quot;unsigned int&quot; der richtige Typ hier ist, der auch von string::size zurückgegeben wird? Das kann hier nach hinten losgehen...</p>
<p>Rookie86 schrieb:</p>
<blockquote>
<pre><code>char* temp = new char[chars];
		m_file.read(temp, chars*sizeof(char));
		value = temp;
		delete temp;
	};
</code></pre>
</blockquote>
<p>Schon wieder new[] mit falschen delete. Nimm doch einfach std::vector&lt;char&gt;. Das ist dann auch Ausnahme-sicher. Also, wenn dir zwischendurch eine Ausnahme um die Ohren fliegt, dann gibt std::vector&lt;char&gt; ordnungsgemäß den Speicher frei, wobei bei Dir ein Speicherleck entstehen würde. Es hat schon seinen Sinn, dass wir Resourcen (inklusive Speicher) &quot;an benutzerdefinierte Objekte binden&quot;. Rohe Zeiger sind einfach dämlich. Die fühlen sich nicht für die Verwaltung des Speichers, auf den sie zeigen, verantwortlich. Von dawegen hast Du hier mit Ihnen die manuelle Speicherverwaltung an der Backe...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144355</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Nov 2011 12:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 13:19:09 GMT]]></title><description><![CDATA[<p>Wenn wir schon dabei sind</p>
<pre><code class="language-cpp">m_file.write((const char*)(value.c_str()), value.size() * sizeof(char));
</code></pre>
<p>Wozu dient der cast zu const char*? c_str() liefert das doch schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144366</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 14 Nov 2011 13:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 13:51:08 GMT]]></title><description><![CDATA[<p>Habs jetzt umgeschrieben und bin endlich das new/delete-Zeugs losgeworden:</p>
<pre><code>template&lt;class T&gt;

	void WriteValue(T value)
    {
        m_file.write(reinterpret_cast&lt;const char*&gt;(&amp;value), sizeof(value));
    }

    void WriteValue(std::string value)
    {
		value.push_back('\0');
		WriteValue&lt;size_t&gt;(value.size());
        m_file.write(value.c_str(), value.size() * sizeof(char));
	}

    template&lt;class T&gt;
    void ReadValue(T value)
    {
  		m_file.read(reinterpret_cast&lt;char*&gt;(&amp;value), sizeof(value));
    }

    void ReadValue(std::string value)
    {
        size_t chars = 0;
        ReadValue&lt;size_t&gt;(chars);
		m_file.read(reinterpret_cast&lt;char*&gt;(&amp;value), chars*sizeof(char));
    }
</code></pre>
<pre><code>#include &lt;iostream&gt;

#include &quot;BinaryFile.h&quot;

int main(int argc, char** argv)
{
	std::string tmpString = std::string(&quot;TestString&quot;);
	int i1 = 1;
	int i2 = 23;

	BinaryFile* bf = new BinaryFile(&quot;test.txt&quot;);
	bf-&gt;WriteValue&lt;std::string&gt;(tmpString);
	bf-&gt;WriteValue&lt;int&gt;(i1);
	bf-&gt;WriteValue&lt;int&gt;(i2);
	delete bf;	

	BinaryFile* bf2 = new BinaryFile(&quot;test.txt&quot;);
	bf-&gt;ReadValue&lt;std::string&gt;(tmpString);
	bf-&gt;ReadValue&lt;int&gt;(i1);
	bf-&gt;ReadValue&lt;int&gt;(i2);
	delete bf2;	

	std::cout &lt;&lt; tmpString.c_str() &lt;&lt; std::endl;
	std::cout &lt;&lt; i1 &lt;&lt; std::endl;
	std::cout &lt;&lt; i2 &lt;&lt; std::endl;
	return 0;
};
</code></pre>
<p>Wenn er durch läuft gibt er mir die richtigen Werte aus... so weit so gut.<br />
Die Zugriffsverletzungen treten aber immer noch auf :(.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>:</p>
<p>value.size() ist vom Typ size_t. size_t ist aber nichts anderes als typedef unsigned int size_t. Trotzdem habe ich den Typ einmal auf size_t gewechselt.</p>
<blockquote>
<pre><code>template&lt;class T&gt; struct id {typedef T type;};

:::

    template&lt;class T&gt;
    void WriteValue(typename id&lt;T&gt;::type value)
    ::::
</code></pre>
</blockquote>
<p>Wie das funktioniert verstehe ich noch nicht ganz (deshalb ist es noch nicht im Code), habe aber bei jedem Write/Read den Typ manuell angegeben als würde mich der Code schon dazu zwingen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1387">@Braunstein</a>: Ja logisch... hab die unnötige Konvertierung entfernt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144380</guid><dc:creator><![CDATA[Rookie86]]></dc:creator><pubDate>Mon, 14 Nov 2011 13:51:08 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 13:58:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void WriteValue(T value)
    {
        m_file.write(reinterpret_cast&lt;const char*&gt;(&amp;value), sizeof(value));
    }
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Ich übersetz das mal: Du schreibst an die Stelle deiner Variable value, welche eine lokale Variable in deiner Funktion ist, soviele chars wie der Wert dieser Variablen.</p>
<p>Wenn's schon mit so einem Hauer losgeht, lese ich lieber gar nicht erst weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144386</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 Nov 2011 13:58:21 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 14:01:39 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Bis auf die Tatsache, dass er den value per const-ref nehmen könnte, sehe ich da nichts schlimmes. Bin ich blind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144390</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 14 Nov 2011 14:01:39 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 14:10:28 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Bis auf die Tatsache, dass er den value per const-ref nehmen könnte, sehe ich da nichts schlimmes. Bin ich blind?</p>
</blockquote>
<p>Kleiner Übersetzungsfehler: Er schreibt nicht so viele Bytes wie im Wert stehen, sondern er überschreibt den Wert einfach. Das zerschießt ihm dann zwar nicht den Stack, es macht einfach nur gar nichts. Und wenn die Funktion dann noch so aufgerufen wird:</p>
<pre><code class="language-cpp">WriteValue&lt;size_t&gt;(value.size());
</code></pre>
<p>Dann ist klar, dass da was total nicht stimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144394</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 Nov 2011 14:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 14:15:07 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>:</p>
<blockquote>
<p>Ich übersetz das mal: Du schreibst an die Stelle deiner Variable value, welche eine lokale Variable in deiner Funktion ist, soviele chars wie der Wert dieser Variablen.</p>
</blockquote>
<p>Nicht ganz, er schreibt von der Position von value soviele Bytes wie value gross ist, bspw. bei einem char also 1 Byte in die Datei. Was ja nicht falsch ist <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, aber im Moment check ichs einfach überhaupt nicht mehr... ist wohl ne kurze Pause nötig und dann muss ich den Code noch mal genau durchspielen bzw. debuggen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144395</guid><dc:creator><![CDATA[Rookie86]]></dc:creator><pubDate>Mon, 14 Nov 2011 14:15:07 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 14:27:50 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void ReadValue(std::string value)
    {
        size_t chars = 0;
        ReadValue&lt;size_t&gt;(chars);
        m_file.read(reinterpret_cast&lt;char*&gt;(&amp;value), chars*sizeof(char));
    }
</code></pre>
<p>Das hier geht gar nicht. Du kannst doch nicht einfach auf die Position deines Strings irgendwelche Daten schreiben. std::string ist doch kein Array.<br />
Wie wärs denn damit.</p>
<pre><code class="language-cpp">std::string ReadValue()
    {
        size_t size = 0; // name size gefällt mir hier einfach besser
        ReadValue(size);
        std::vector&lt;char&gt; tmp(size);
        m_file.read(&amp;tmp[0], size * sizeof(char)); // das sizeof(char) finde ich hier unnötig
        return std::string(tmp.begin(), tmp.end());
    }
</code></pre>
<p>PS Sepps Kritik kann ich hier nicht nachvollziehen. write schreibt schließlich in den Stream und nicht in die Variable.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144401</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 14 Nov 2011 14:27:50 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 14:40:11 GMT]]></title><description><![CDATA[<p>Rookie86 schrieb:</p>
<blockquote>
<p>Nicht ganz, er schreibt von der Position von value soviele Bytes wie value gross ist, bspw. bei einem char also 1 Byte in die Datei. Was ja nicht falsch ist <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>Oh, ähh. Ich brauch 'nen Kaffee. Aber schnell...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144411</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 Nov 2011 14:40:11 GMT</pubDate></item><item><title><![CDATA[Reply to String wird falsch aus Datei gelesen (Binär) on Mon, 14 Nov 2011 14:59:39 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1387">@Braunstein</a>: Es funktioniert! <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>Boah, war das ein Kampf... wieder was gelernt.</p>
<p>Vielen dank für eure Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144419</guid><dc:creator><![CDATA[Rookie86]]></dc:creator><pubDate>Mon, 14 Nov 2011 14:59:39 GMT</pubDate></item></channel></rss>