<?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[Problem beim Einlesen einer Struktur]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes:</p>
<pre><code class="language-cpp">void LiesSaetze(aartVektor &amp;av)
{
	ifstream dat(datei);
	if(!dat)
		return;

	aartSatz tmp; cout &lt;&lt; &quot;tellg = &quot; &lt;&lt; dat.tellg() &lt;&lt; endl;
	dat.read(reinterpret_cast&lt;char*&gt;(&amp;tmp), sizeof(aartSatz));

	while (!dat.eof())
	{
		av.push_back(tmp); cout &lt;&lt; &quot;tellg = &quot; &lt;&lt; dat.tellg() &lt;&lt; endl;
		dat.read(reinterpret_cast&lt;char*&gt;(&amp;tmp), sizeof(aartSatz));
	}
}
</code></pre>
<p>erzeugt diese Ausgabe:<br />
tellg = 0<br />
tellg = 18<br />
tellg = 34<br />
tellg = 50<br />
tellg = 66</p>
<p>Die eingelesene Struktur ist eine Klasse mit vier Membervariablen vom Typ int. Das Erzeugen der Datei geschieht analog durch write(..., sizeof(aartSatz).<br />
Interessanterweise ist der allererste Satz 2 Byte länger als die restlichen, wie man den tellg-Ausgaben oben entnehmen kann. Trotzdem funktioniert das Einlesen, aus irgendeinem Grund wird das richtigerweise berücksichtigt ...<br />
Ein Problem habe ich jetzt jedoch, wenn ich per random - Zugriff mit einem Vielfachen von sizeof(aartSatz) einen Eintrag überschreiben will, dann 'lande' ich nämlich 2 Byte zu früh.<br />
Wieso werden beim ersten Satz diese 2 Byte zu viel geschrieben? Sie landen eines hinter dem ersten Integer und eines hinter dem dritten Integer und haben den Wert 0x0D.<br />
Das Schreiben der Datei geht übrigens:</p>
<pre><code class="language-cpp">ofstream dat(datei, ios::out | ios::app);
	dat.write(reinterpret_cast&lt;char*&gt;(&amp;as), sizeof(aartSatz));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/226045/problem-beim-einlesen-einer-struktur</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 03:24:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226045.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Oct 2008 15:34:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem beim Einlesen einer Struktur on Tue, 28 Oct 2008 15:34:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes:</p>
<pre><code class="language-cpp">void LiesSaetze(aartVektor &amp;av)
{
	ifstream dat(datei);
	if(!dat)
		return;

	aartSatz tmp; cout &lt;&lt; &quot;tellg = &quot; &lt;&lt; dat.tellg() &lt;&lt; endl;
	dat.read(reinterpret_cast&lt;char*&gt;(&amp;tmp), sizeof(aartSatz));

	while (!dat.eof())
	{
		av.push_back(tmp); cout &lt;&lt; &quot;tellg = &quot; &lt;&lt; dat.tellg() &lt;&lt; endl;
		dat.read(reinterpret_cast&lt;char*&gt;(&amp;tmp), sizeof(aartSatz));
	}
}
</code></pre>
<p>erzeugt diese Ausgabe:<br />
tellg = 0<br />
tellg = 18<br />
tellg = 34<br />
tellg = 50<br />
tellg = 66</p>
<p>Die eingelesene Struktur ist eine Klasse mit vier Membervariablen vom Typ int. Das Erzeugen der Datei geschieht analog durch write(..., sizeof(aartSatz).<br />
Interessanterweise ist der allererste Satz 2 Byte länger als die restlichen, wie man den tellg-Ausgaben oben entnehmen kann. Trotzdem funktioniert das Einlesen, aus irgendeinem Grund wird das richtigerweise berücksichtigt ...<br />
Ein Problem habe ich jetzt jedoch, wenn ich per random - Zugriff mit einem Vielfachen von sizeof(aartSatz) einen Eintrag überschreiben will, dann 'lande' ich nämlich 2 Byte zu früh.<br />
Wieso werden beim ersten Satz diese 2 Byte zu viel geschrieben? Sie landen eines hinter dem ersten Integer und eines hinter dem dritten Integer und haben den Wert 0x0D.<br />
Das Schreiben der Datei geht übrigens:</p>
<pre><code class="language-cpp">ofstream dat(datei, ios::out | ios::app);
	dat.write(reinterpret_cast&lt;char*&gt;(&amp;as), sizeof(aartSatz));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1606132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606132</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 28 Oct 2008 15:34:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Einlesen einer Struktur on Tue, 28 Oct 2008 15:44:05 GMT]]></title><description><![CDATA[<p>Du solltest vielleicht noch <code>ios_base::binary</code> setzen. Ansonsten werden bestimmte Zeichen von fstream interpretiert, und nicht einfach gelesen/geschrieben. Das gleiche gilt auch für das Schreiben der Datei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606145</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 28 Oct 2008 15:44:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Einlesen einer Struktur on Tue, 28 Oct 2008 15:52:27 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Du solltest vielleicht noch <code>ios_base::binary</code> setzen. Ansonsten werden bestimmte Zeichen von fstream interpretiert, und nicht einfach gelesen/geschrieben. Das gleiche gilt auch für das Schreiben der Datei.</p>
</blockquote>
<p>Guter Hinweis. Allerdings ist für heute Feierabend <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="🙂"
    /> Morgen werde ich das aber ausprobieren. Verwundert hat mich halt, daß nur der allererste Satz zu lang wird ...</p>
<p>Ließ mir keine Ruhe bis morgen! That's it!!!</p>
<p>Ich danke Dir sehr vielmals!<br />
Kann ich Dir irgendwie ein Bier mailen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606150</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 28 Oct 2008 15:52:27 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Einlesen einer Struktur on Tue, 28 Oct 2008 16:07:49 GMT]]></title><description><![CDATA[<p>Hi jetzt mal ne Frage zu diesem Codestück (auch wenns nicht richtig dazu passt. Wollte aber keinen neuen Thread aufmachen :))</p>
<p>Belli schrieb:</p>
<blockquote>
<pre><code class="language-cpp">ifstream dat(datei);
	if(!dat)
		return;
</code></pre>
</blockquote>
<p>Warum kann ich</p>
<p>if(!dat)</p>
<p>schreibn? welchen Operator muss ich da bei meiner eigenen Klasse überladen das das bei mir au funktioniert?</p>
<p>Mfg Pingu-Group</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606158</guid><dc:creator><![CDATA[Pingu-Group]]></dc:creator><pubDate>Tue, 28 Oct 2008 16:07:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Einlesen einer Struktur on Tue, 28 Oct 2008 16:51:41 GMT]]></title><description><![CDATA[<p>Pingu-Group schrieb:</p>
<blockquote>
<p>...schreibn? welchen Operator muss ich da bei meiner eigenen Klasse überladen das das bei mir au funktioniert?</p>
<p>Mfg Pingu-Group</p>
</blockquote>
<p>In diesem Falle wird der Cast-Operator nach void* überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606178</guid><dc:creator><![CDATA[Tachyon@loggedoff]]></dc:creator><pubDate>Tue, 28 Oct 2008 16:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Einlesen einer Struktur on Wed, 29 Oct 2008 13:50:29 GMT]]></title><description><![CDATA[<p>Tachyon@loggedoff schrieb:</p>
<blockquote>
<p>In diesem Falle wird der Cast-Operator nach void* überladen.</p>
</blockquote>
<p>Wieso eigentlich nicht <code>bool</code> ? Damit man es nicht aus Versehen implizit in einen Integer konvertiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606631</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 29 Oct 2008 13:50:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Einlesen einer Struktur on Wed, 29 Oct 2008 14:46:29 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Tachyon@loggedoff schrieb:</p>
<blockquote>
<p>In diesem Falle wird der Cast-Operator nach void* überladen.</p>
</blockquote>
<p>Wieso eigentlich nicht <code>bool</code> ? Damit man es nicht aus Versehen implizit in einen Integer konvertiert?</p>
</blockquote>
<p>Jup. Das gute &quot;Safe Bool Idiom&quot;. <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>Dann würde nämlich z.B. sowas gehen:</p>
<pre><code class="language-cpp">int kacke;
std::cin &lt;&lt; kacke; //Bitshift!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1606670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606670</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 29 Oct 2008 14:46:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Einlesen einer Struktur on Wed, 29 Oct 2008 15:00:34 GMT]]></title><description><![CDATA[<p>Okay. Bei überladenem Cast-Operator muss man generell sehr aufpassen, da man dadurch seine Freiheiten immer sehr ausweitet.</p>
<p>Bei einfachen Klassen, die keine arithmetischen Operatoren überladen, würde <code>operator bool</code> also nichts machen. Genau gesehen könnte man aber bei <code>std::ostream</code> auf die folgende Idee kommen und hat damit vielleicht sogar einen ungültigen Zeiger: :p</p>
<pre><code class="language-cpp">void* ptr = std::cin;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1606693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606693</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 29 Oct 2008 15:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Einlesen einer Struktur on Wed, 29 Oct 2008 15:24:09 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Okay. Bei überladenem Cast-Operator muss man generell sehr aufpassen, da man dadurch seine Freiheiten immer sehr ausweitet.</p>
<p>Bei einfachen Klassen, die keine arithmetischen Operatoren überladen, würde <code>operator bool</code> also nichts machen. Genau gesehen könnte man aber bei <code>std::ostream</code> auf die folgende Idee kommen und hat damit vielleicht sogar einen ungültigen Zeiger: :p</p>
<pre><code class="language-cpp">void* ptr = std::cin;
</code></pre>
</blockquote>
<p>Ja, aber dafür muss man schon ziemlich böswillig sein. Um &gt;&gt; mit &lt;&lt; zu verwechseln brauchts nur mal einen vergessenen Druck auf die Shift-Taste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606707</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 29 Oct 2008 15:24:09 GMT</pubDate></item></channel></rss>