<?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[Speicherung einzelner Bytes]]></title><description><![CDATA[<p>Guten Abend zusammen <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>Ich habe ein etwas seltsames problem. ich habe eine methode zur speicherung von daten. bisher hat das auch super geklappt, aber jetzt plötzlich, macht er probleme und will das nicht mehr so wirkl. wieder einlesen.</p>
<p>also ich habe folgende routine:</p>
<pre><code>void Save() {
		// Datei leer öffnen
		file = fopen(dlg.GetPathName(), &quot;wb&quot;);

                // Alle Elemente speichern
		for (curElement = pFirstElement; curElement != NULL; curElement = curElement-&gt;nextElement)
				curElement-&gt;SaveToFile(file, &amp;frameRect);

		// Datei schließen
		fclose(file);
}
</code></pre>
<p>Dann habe ich natürl. noch die Klasse Elements, der curElement angehört:</p>
<pre><code>//////////////////////////////////////////////////////////////////////
void CElements::SaveToFile(FILE *pFile, CRect* pFrameRect)
//
//////////////////////////////////////////////////////////////////////
{
	byte	byteBuffer;
	short	shortBuffer;
	char	charBuffer;

	// ChunkID
	byteBuffer = 2;
	fwrite(&amp;byteBuffer, 1, 1, pFile);

	// ID des Elementes Speichern
	byteBuffer = id;
	fwrite(&amp;byteBuffer, 1, 1, pFile);

	// Type des Elementes
	byteBuffer = type;
	fwrite(&amp;byteBuffer, 1, 1, pFile);

	// x- und y-Choords bestimmen (Konvertierung in relative Koordianten)
	shortBuffer = (short) (boundingRect.left - pFrameRect-&gt;left);
	fwrite(&amp;shortBuffer, 2, 1, pFile);
	shortBuffer = (short) (boundingRect.top - pFrameRect-&gt;top);
	fwrite(&amp;shortBuffer, 2, 1, pFile);

	// Breite und Höhe des Elementes 
	shortBuffer = boundingRect.Width();
	fwrite(&amp;shortBuffer, 2, 1, pFile);
	shortBuffer = boundingRect.Height();
	fwrite(&amp;shortBuffer, 2, 1, pFile);

	// RGB-Farbe des Elementes
	byteBuffer = 0;
	fwrite(&amp;byteBuffer, 1, 1, pFile); // Rot
	fwrite(&amp;byteBuffer, 1, 1, pFile); // Grün
	fwrite(&amp;byteBuffer, 1, 1, pFile); // Blau

	// Anzeigestatus (Anzeigen, Aktivieren)
	byteBuffer = (show)? 1:0; // Anzeigen
	fwrite(&amp;byteBuffer, 1, 1, pFile);
	byteBuffer = (deactive)? 0:1; // Aktivieren
	fwrite(&amp;byteBuffer, 1, 1, pFile);

	// es folgt (zunächst) direkt der Event-Function-Block
	// Anzahl der Funktionen
	shortBuffer = 0;
	for (int i=0; i&lt;23; i++) 
	{
		if (aAction[i]) shortBuffer++;
	}
	fwrite(&amp;shortBuffer, 2, 1, pFile);

	// es folgen die einzelnen Funktionsblöcke
	for (i=0; i&lt;23; i++)
	{
		// Überprüfung, ob überhaupt eine Funktion vorliegt
		if (!aAction[i]) continue;

		// ChunkID
		byteBuffer = 5;
		fwrite(&amp;byteBuffer, 1, 1, pFile);

		// Event
		byteBuffer = (byte)i;
		fwrite(&amp;byteBuffer, 1, 1, pFile);

		// refID des eigentl. Befehls
		shortBuffer = (short)aAction[i]-&gt;GetRefCmd()-&gt;GetID();
		fwrite(&amp;shortBuffer, 2, 1, pFile);

		// Parameter
		byteBuffer = aAction[i]-&gt;parameters.GetLength();
		for (int j=0; j&lt;byteBuffer; j++)
		{
			charBuffer = aAction[i]-&gt;parameters.GetAt(j); 
			fwrite(&amp;charBuffer, 2, 1, pFile);
		} // for (int j=0; j&lt;byteBuffer; j++)
		charBuffer = '#';
		fwrite(&amp;charBuffer, 2, 1, pFile);
	}

	// Elementbeschriftung
	byteBuffer = title.GetLength();
	for (i=0; i&lt;byteBuffer; i++)
	{
		charBuffer = title.GetAt(i); 
		fwrite(&amp;charBuffer, 2, 1, pFile);
	} // for (int i=0; i&lt;byteBuffer; i++)
	charBuffer = '#';
	fwrite(&amp;charBuffer, 2, 1, pFile);

}
// void CElements::SaveToFile(FILE *pFile)
// *******************************************************************
//////////////////////////////////////////////////////////////////////
</code></pre>
<p>Soweit so klar. Nun habe ich noch einen Konstruktor der Klasse CElements, der beim Laden der Datei benutzt wird:</p>
<pre><code>CElements::CElements(FILE* pFile, CRect* pFrameRect, CElements* pPrevElement, CCommands* listHeader01, CCommands* listHeader02)
{
	byte		byteBuffer;
	short		shortBuffer;
	char		charBuffer;
	CPoint		topLeftPoint;
	CCommands*	refCommand;
	CString		parameter;

	// allgm. Einstellungen
	prevElement = pPrevElement; 
	nextElement = NULL;
	fixed = false;
	if (pPrevElement) pPrevElement-&gt;nextElement = this; // Vorgängers next-Element aktualisieren

	// Daten aus pFile auslesen

	// ChunkID
	fread(&amp;byteBuffer, 1, 1, pFile);

	// ID des Elementes 
	fread(&amp;byteBuffer, 1, 1, pFile);
	id = byteBuffer;
	if (id &gt; counter) counter = id;

	// Type des Elementes
	fread(&amp;byteBuffer, 1, 1, pFile);
	type = byteBuffer;

	// x- und y-Choords bestimmen (Konvertierung in absolute Koordianten)
	fread(&amp;shortBuffer, 2, 1, pFile);
	boundingRect.left = shortBuffer + pFrameRect-&gt;left;
	fread(&amp;shortBuffer, 2, 1, pFile);
	boundingRect.top = shortBuffer + pFrameRect-&gt;top;

	// Breite und Höhe des Elementes 
	fread(&amp;shortBuffer, 2, 1, pFile);
	boundingRect.right = boundingRect.left+shortBuffer;
	fread(&amp;shortBuffer, 2, 1, pFile);
	boundingRect.bottom = boundingRect.top+shortBuffer;

	// RGB-Farbe des Elementes
	fread(&amp;byteBuffer, 1, 1, pFile); // Rot
	fread(&amp;byteBuffer, 1, 1, pFile); // Grün
	fread(&amp;byteBuffer, 1, 1, pFile); // Blau

	// Anzeigestatus (Anzeigen, Aktivieren)
	fread(&amp;byteBuffer, 1, 1, pFile);
	show = (byteBuffer == 1)?true:false;
	fread(&amp;byteBuffer, 1, 1, pFile);
	deactive = (byteBuffer == 0)?true:false;

	// es folgt (zunächst) direkt der Event-Function-Block
	// initial alles NULL
	for (int i=0; i&lt;23; i++)
		aAction[i] = NULL;

	// Anzahl der Funktionen
	fread(&amp;shortBuffer, 2, 1, pFile);

	// es folgen die einzelnen Funktionsblöcke
	for (i=0; i&lt;shortBuffer; i++)
	{
		// ChunkID
		fread(&amp;byteBuffer, 1, 1, pFile);

		// Event
		fread(&amp;byteBuffer, 1, 1, pFile);

		// refID des eigentl. Befehls
		fread(&amp;shortBuffer, 2, 1, pFile);

		// Refernzbefehl auf den ersten der Liste (Selbstdefinierte Befehle) setzen
		refCommand = listHeader01;
		if (!refCommand) refCommand = listHeader02;

		while (refCommand-&gt;GetID() != shortBuffer) 
		{
			if ((!refCommand-&gt;next) &amp;&amp; (refCommand-&gt;commands))
				refCommand = listHeader02;
			else if (refCommand) refCommand = refCommand-&gt;next;
		}

		// wenn kein Unterbefehl gefunden wurde =&gt; Abbruch
		if (!refCommand) return;

		// Parameter
		parameter.Empty();

		fread(&amp;charBuffer, 2, 1, pFile);
		while (charBuffer != '#')
		{
			parameter += charBuffer;
			fread(&amp;charBuffer, 2, 1, pFile);
		} // for (int i=0; i&lt;byteBuffer; i++)

		if (refCommand)
			// es wurde ein &quot;Unterbefehl gefunden mit Parameter
			aAction[byteBuffer] = new CCommands(refCommand, parameter);

	}

	// Elementbeschriftung
	for (i=0; i&lt;255; i++)
	{
		fread(&amp;charBuffer, 2, 1, pFile);
		if (charBuffer == '#') break;
		title += charBuffer;
	} // for (int i=0; i&lt;byteBuffer; i++)

}
</code></pre>
<p>Mein Problem ist jetzt, dass das Speichern bei einer Anzahl von 7 Elementen super funktioniert, aber bei 8 macht er probleme. wobei das irgendwie unterschiedlich ist, denn ich habe auch schon versionen gehabt, wo ich 15 elemente hatte und es funktioniert hat.</p>
<p>Ich weiß, dass er irgendwann einfach eine schwachsinnige x-/y-Koordinate für die Elemente einliest. Aber ich weiß auch, dass er beim schreiben die richtigen werte zumindest einliest und eigentlich dann auch schreiben müsste.</p>
<p>Meine Frage daher: Kann das irgendwas mit der art und weise, wie ich speicher zu tun haben? Hab ich die funktionen fread() und fwrite() irgendwie falsch benutzt?</p>
<p>Schönen Abend noch,<br />
Hannes</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/175475/speicherung-einzelner-bytes</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Apr 2026 13:57:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/175475.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 10 Mar 2007 21:15:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherung einzelner Bytes on Sat, 10 Mar 2007 21:15:27 GMT]]></title><description><![CDATA[<p>Guten Abend zusammen <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>Ich habe ein etwas seltsames problem. ich habe eine methode zur speicherung von daten. bisher hat das auch super geklappt, aber jetzt plötzlich, macht er probleme und will das nicht mehr so wirkl. wieder einlesen.</p>
<p>also ich habe folgende routine:</p>
<pre><code>void Save() {
		// Datei leer öffnen
		file = fopen(dlg.GetPathName(), &quot;wb&quot;);

                // Alle Elemente speichern
		for (curElement = pFirstElement; curElement != NULL; curElement = curElement-&gt;nextElement)
				curElement-&gt;SaveToFile(file, &amp;frameRect);

		// Datei schließen
		fclose(file);
}
</code></pre>
<p>Dann habe ich natürl. noch die Klasse Elements, der curElement angehört:</p>
<pre><code>//////////////////////////////////////////////////////////////////////
void CElements::SaveToFile(FILE *pFile, CRect* pFrameRect)
//
//////////////////////////////////////////////////////////////////////
{
	byte	byteBuffer;
	short	shortBuffer;
	char	charBuffer;

	// ChunkID
	byteBuffer = 2;
	fwrite(&amp;byteBuffer, 1, 1, pFile);

	// ID des Elementes Speichern
	byteBuffer = id;
	fwrite(&amp;byteBuffer, 1, 1, pFile);

	// Type des Elementes
	byteBuffer = type;
	fwrite(&amp;byteBuffer, 1, 1, pFile);

	// x- und y-Choords bestimmen (Konvertierung in relative Koordianten)
	shortBuffer = (short) (boundingRect.left - pFrameRect-&gt;left);
	fwrite(&amp;shortBuffer, 2, 1, pFile);
	shortBuffer = (short) (boundingRect.top - pFrameRect-&gt;top);
	fwrite(&amp;shortBuffer, 2, 1, pFile);

	// Breite und Höhe des Elementes 
	shortBuffer = boundingRect.Width();
	fwrite(&amp;shortBuffer, 2, 1, pFile);
	shortBuffer = boundingRect.Height();
	fwrite(&amp;shortBuffer, 2, 1, pFile);

	// RGB-Farbe des Elementes
	byteBuffer = 0;
	fwrite(&amp;byteBuffer, 1, 1, pFile); // Rot
	fwrite(&amp;byteBuffer, 1, 1, pFile); // Grün
	fwrite(&amp;byteBuffer, 1, 1, pFile); // Blau

	// Anzeigestatus (Anzeigen, Aktivieren)
	byteBuffer = (show)? 1:0; // Anzeigen
	fwrite(&amp;byteBuffer, 1, 1, pFile);
	byteBuffer = (deactive)? 0:1; // Aktivieren
	fwrite(&amp;byteBuffer, 1, 1, pFile);

	// es folgt (zunächst) direkt der Event-Function-Block
	// Anzahl der Funktionen
	shortBuffer = 0;
	for (int i=0; i&lt;23; i++) 
	{
		if (aAction[i]) shortBuffer++;
	}
	fwrite(&amp;shortBuffer, 2, 1, pFile);

	// es folgen die einzelnen Funktionsblöcke
	for (i=0; i&lt;23; i++)
	{
		// Überprüfung, ob überhaupt eine Funktion vorliegt
		if (!aAction[i]) continue;

		// ChunkID
		byteBuffer = 5;
		fwrite(&amp;byteBuffer, 1, 1, pFile);

		// Event
		byteBuffer = (byte)i;
		fwrite(&amp;byteBuffer, 1, 1, pFile);

		// refID des eigentl. Befehls
		shortBuffer = (short)aAction[i]-&gt;GetRefCmd()-&gt;GetID();
		fwrite(&amp;shortBuffer, 2, 1, pFile);

		// Parameter
		byteBuffer = aAction[i]-&gt;parameters.GetLength();
		for (int j=0; j&lt;byteBuffer; j++)
		{
			charBuffer = aAction[i]-&gt;parameters.GetAt(j); 
			fwrite(&amp;charBuffer, 2, 1, pFile);
		} // for (int j=0; j&lt;byteBuffer; j++)
		charBuffer = '#';
		fwrite(&amp;charBuffer, 2, 1, pFile);
	}

	// Elementbeschriftung
	byteBuffer = title.GetLength();
	for (i=0; i&lt;byteBuffer; i++)
	{
		charBuffer = title.GetAt(i); 
		fwrite(&amp;charBuffer, 2, 1, pFile);
	} // for (int i=0; i&lt;byteBuffer; i++)
	charBuffer = '#';
	fwrite(&amp;charBuffer, 2, 1, pFile);

}
// void CElements::SaveToFile(FILE *pFile)
// *******************************************************************
//////////////////////////////////////////////////////////////////////
</code></pre>
<p>Soweit so klar. Nun habe ich noch einen Konstruktor der Klasse CElements, der beim Laden der Datei benutzt wird:</p>
<pre><code>CElements::CElements(FILE* pFile, CRect* pFrameRect, CElements* pPrevElement, CCommands* listHeader01, CCommands* listHeader02)
{
	byte		byteBuffer;
	short		shortBuffer;
	char		charBuffer;
	CPoint		topLeftPoint;
	CCommands*	refCommand;
	CString		parameter;

	// allgm. Einstellungen
	prevElement = pPrevElement; 
	nextElement = NULL;
	fixed = false;
	if (pPrevElement) pPrevElement-&gt;nextElement = this; // Vorgängers next-Element aktualisieren

	// Daten aus pFile auslesen

	// ChunkID
	fread(&amp;byteBuffer, 1, 1, pFile);

	// ID des Elementes 
	fread(&amp;byteBuffer, 1, 1, pFile);
	id = byteBuffer;
	if (id &gt; counter) counter = id;

	// Type des Elementes
	fread(&amp;byteBuffer, 1, 1, pFile);
	type = byteBuffer;

	// x- und y-Choords bestimmen (Konvertierung in absolute Koordianten)
	fread(&amp;shortBuffer, 2, 1, pFile);
	boundingRect.left = shortBuffer + pFrameRect-&gt;left;
	fread(&amp;shortBuffer, 2, 1, pFile);
	boundingRect.top = shortBuffer + pFrameRect-&gt;top;

	// Breite und Höhe des Elementes 
	fread(&amp;shortBuffer, 2, 1, pFile);
	boundingRect.right = boundingRect.left+shortBuffer;
	fread(&amp;shortBuffer, 2, 1, pFile);
	boundingRect.bottom = boundingRect.top+shortBuffer;

	// RGB-Farbe des Elementes
	fread(&amp;byteBuffer, 1, 1, pFile); // Rot
	fread(&amp;byteBuffer, 1, 1, pFile); // Grün
	fread(&amp;byteBuffer, 1, 1, pFile); // Blau

	// Anzeigestatus (Anzeigen, Aktivieren)
	fread(&amp;byteBuffer, 1, 1, pFile);
	show = (byteBuffer == 1)?true:false;
	fread(&amp;byteBuffer, 1, 1, pFile);
	deactive = (byteBuffer == 0)?true:false;

	// es folgt (zunächst) direkt der Event-Function-Block
	// initial alles NULL
	for (int i=0; i&lt;23; i++)
		aAction[i] = NULL;

	// Anzahl der Funktionen
	fread(&amp;shortBuffer, 2, 1, pFile);

	// es folgen die einzelnen Funktionsblöcke
	for (i=0; i&lt;shortBuffer; i++)
	{
		// ChunkID
		fread(&amp;byteBuffer, 1, 1, pFile);

		// Event
		fread(&amp;byteBuffer, 1, 1, pFile);

		// refID des eigentl. Befehls
		fread(&amp;shortBuffer, 2, 1, pFile);

		// Refernzbefehl auf den ersten der Liste (Selbstdefinierte Befehle) setzen
		refCommand = listHeader01;
		if (!refCommand) refCommand = listHeader02;

		while (refCommand-&gt;GetID() != shortBuffer) 
		{
			if ((!refCommand-&gt;next) &amp;&amp; (refCommand-&gt;commands))
				refCommand = listHeader02;
			else if (refCommand) refCommand = refCommand-&gt;next;
		}

		// wenn kein Unterbefehl gefunden wurde =&gt; Abbruch
		if (!refCommand) return;

		// Parameter
		parameter.Empty();

		fread(&amp;charBuffer, 2, 1, pFile);
		while (charBuffer != '#')
		{
			parameter += charBuffer;
			fread(&amp;charBuffer, 2, 1, pFile);
		} // for (int i=0; i&lt;byteBuffer; i++)

		if (refCommand)
			// es wurde ein &quot;Unterbefehl gefunden mit Parameter
			aAction[byteBuffer] = new CCommands(refCommand, parameter);

	}

	// Elementbeschriftung
	for (i=0; i&lt;255; i++)
	{
		fread(&amp;charBuffer, 2, 1, pFile);
		if (charBuffer == '#') break;
		title += charBuffer;
	} // for (int i=0; i&lt;byteBuffer; i++)

}
</code></pre>
<p>Mein Problem ist jetzt, dass das Speichern bei einer Anzahl von 7 Elementen super funktioniert, aber bei 8 macht er probleme. wobei das irgendwie unterschiedlich ist, denn ich habe auch schon versionen gehabt, wo ich 15 elemente hatte und es funktioniert hat.</p>
<p>Ich weiß, dass er irgendwann einfach eine schwachsinnige x-/y-Koordinate für die Elemente einliest. Aber ich weiß auch, dass er beim schreiben die richtigen werte zumindest einliest und eigentlich dann auch schreiben müsste.</p>
<p>Meine Frage daher: Kann das irgendwas mit der art und weise, wie ich speicher zu tun haben? Hab ich die funktionen fread() und fwrite() irgendwie falsch benutzt?</p>
<p>Schönen Abend noch,<br />
Hannes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243114</guid><dc:creator><![CDATA[schuri]]></dc:creator><pubDate>Sat, 10 Mar 2007 21:15:27 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherung einzelner Bytes on Sat, 10 Mar 2007 21:47:09 GMT]]></title><description><![CDATA[<p>du benutzt bei 'fread' und 'fwrite' hardcodierte konstanten für die länge, da können sich schnell fehler einschleichen. nimm besser 'sizeof()'.</p>
<p>btw: erstmal musste rauskriegen, ob read oder write hakelt. du könntest dir z.b. erstmal ein paar generierte dateien mit einem hexeditor angucken, ob da alles stimmt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243127</guid><dc:creator><![CDATA[ten]]></dc:creator><pubDate>Sat, 10 Mar 2007 21:47:09 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherung einzelner Bytes on Sat, 10 Mar 2007 22:45:36 GMT]]></title><description><![CDATA[<p>Ich hab es *freu*.</p>
<p>Das Problem war in dem Konstruktor:</p>
<pre><code>// Anzahl der Funktionen
    fread(&amp;shortBuffer, 2, 1, pFile);

    // es folgen die einzelnen Funktionsblöcke
    for (i=0; i&lt;shortBuffer; i++)
    { 
         ....
    }
</code></pre>
<p>In der for-Schleife wurde shortBuffer überschrieben <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="😞"
    /><br />
So ein simpler Fehler... Naja, man lernt nur aus fehlern ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243144</guid><dc:creator><![CDATA[schuri]]></dc:creator><pubDate>Sat, 10 Mar 2007 22:45:36 GMT</pubDate></item></channel></rss>