<?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[Chunks in Datei schreiben und auslesen]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche gerade Daten aus einem Programm binär in eine Datei zu speichern und dann wieder auszulesen. Als Beispiel dient hier der String &quot;Hallo ich bins&quot;. Den will ich 4 mal in eine Chunkbasierte-Datei schreiben und anschließend wieder auslesen:</p>
<pre><code class="language-cpp">enum Typen
{
	PRODUKTIONSGEBAUDE,
	ARBEITERGEBAUDE,
	KARTE,
	GLOBALS,
	AUFGABEN
};

struct ChunkHeader
{
	Typen	ChunkTyp;
	DWORD	dwDataSize;
};

ChunkHeader CH;
DWORD		Anzahl;
FILE*		pFile;

pFile = fopen(pcFilename, &quot;wb&quot;);

char acText[256];
DWORD Grosse;
strcpy(acText, &quot;Hallo ich bins&quot;);

CH.ChunkTyp = AUFGABEN;
//Chunkheader schreiben
fwrite(&amp;CH, sizeof(ChunkHeader), 1, pFile);
Anzahl = 4;
fwrite(&amp;Anzahl, sizeof(DWORD), 1, pFile);

for(int i = 0; i &lt; 4; i++)
{
	Grosse = sizeof(acText);
	fwrite(&amp;Grosse, sizeof(DWORD), 1, pFile);
	fwrite(acText, Grosse, 1, pFile);
}
fclose(pFile);

char actext[256];
pFile = fopen(pcFilename, &quot;rb&quot;);
if(pFile == NULL) { cout &lt;&lt; &quot;Fehler beim Laden\n&quot;; return 1;}

while(!feof(pFile))
{
	//Chunkheader lesen:
	fread(&amp;CH, sizeof(ChunkHeader), 1, pFile); 
	cout&lt;&lt;&quot;DRIN&quot;;
	if(CH.ChunkTyp == AUFGABEN)
	{
		fread(&amp;Anzahl, sizeof(DWORD), 1, pFile);
		for(i = 0; i &lt; Anzahl; i++) 
		{
			fread(&amp;Grosse, sizeof(DWORD), 1, pFile);
			fread(actext, Grosse, 1, pFile);
			cout&lt;&lt;actext&lt;&lt;&quot;\n&quot;;
		}
	}
}
fclose(pFile);
</code></pre>
<p>Eigentlich sollte er die while-Schleife beim widerauslesen nur einmal durchlaufen, da ich ja auch nur einmal einen Chunk AUFGABEN vorher in die Datei geschrieben habe. Wenn ich das jetzt aber ausgeben lasse, durchläuft der die Schleife 2 mal und geht beim 2. Mal auch wieder in die If-Abfrage, ob es sich um eine Aufgabe handelt. Dabei gibt er dann wieder 4 mal den letzten String aus. (Ich habe es vorher mit 4 unterschiedlichen Strings versucht und beim zweiten mal wird nur noch der 4. String 4 Mal ausgegeben)</p>
<p>Wie kann das sein, weiß jemand den Fehler?</p>
<p>Vielen Dank für eine Antwort, viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/196665/chunks-in-datei-schreiben-und-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 14:15:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/196665.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Nov 2007 14:21:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Chunks in Datei schreiben und auslesen on Thu, 01 Nov 2007 14:21:21 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche gerade Daten aus einem Programm binär in eine Datei zu speichern und dann wieder auszulesen. Als Beispiel dient hier der String &quot;Hallo ich bins&quot;. Den will ich 4 mal in eine Chunkbasierte-Datei schreiben und anschließend wieder auslesen:</p>
<pre><code class="language-cpp">enum Typen
{
	PRODUKTIONSGEBAUDE,
	ARBEITERGEBAUDE,
	KARTE,
	GLOBALS,
	AUFGABEN
};

struct ChunkHeader
{
	Typen	ChunkTyp;
	DWORD	dwDataSize;
};

ChunkHeader CH;
DWORD		Anzahl;
FILE*		pFile;

pFile = fopen(pcFilename, &quot;wb&quot;);

char acText[256];
DWORD Grosse;
strcpy(acText, &quot;Hallo ich bins&quot;);

CH.ChunkTyp = AUFGABEN;
//Chunkheader schreiben
fwrite(&amp;CH, sizeof(ChunkHeader), 1, pFile);
Anzahl = 4;
fwrite(&amp;Anzahl, sizeof(DWORD), 1, pFile);

for(int i = 0; i &lt; 4; i++)
{
	Grosse = sizeof(acText);
	fwrite(&amp;Grosse, sizeof(DWORD), 1, pFile);
	fwrite(acText, Grosse, 1, pFile);
}
fclose(pFile);

char actext[256];
pFile = fopen(pcFilename, &quot;rb&quot;);
if(pFile == NULL) { cout &lt;&lt; &quot;Fehler beim Laden\n&quot;; return 1;}

while(!feof(pFile))
{
	//Chunkheader lesen:
	fread(&amp;CH, sizeof(ChunkHeader), 1, pFile); 
	cout&lt;&lt;&quot;DRIN&quot;;
	if(CH.ChunkTyp == AUFGABEN)
	{
		fread(&amp;Anzahl, sizeof(DWORD), 1, pFile);
		for(i = 0; i &lt; Anzahl; i++) 
		{
			fread(&amp;Grosse, sizeof(DWORD), 1, pFile);
			fread(actext, Grosse, 1, pFile);
			cout&lt;&lt;actext&lt;&lt;&quot;\n&quot;;
		}
	}
}
fclose(pFile);
</code></pre>
<p>Eigentlich sollte er die while-Schleife beim widerauslesen nur einmal durchlaufen, da ich ja auch nur einmal einen Chunk AUFGABEN vorher in die Datei geschrieben habe. Wenn ich das jetzt aber ausgeben lasse, durchläuft der die Schleife 2 mal und geht beim 2. Mal auch wieder in die If-Abfrage, ob es sich um eine Aufgabe handelt. Dabei gibt er dann wieder 4 mal den letzten String aus. (Ich habe es vorher mit 4 unterschiedlichen Strings versucht und beim zweiten mal wird nur noch der 4. String 4 Mal ausgegeben)</p>
<p>Wie kann das sein, weiß jemand den Fehler?</p>
<p>Vielen Dank für eine Antwort, viele Grüße<br />
Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1395898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395898</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Thu, 01 Nov 2007 14:21:21 GMT</pubDate></item><item><title><![CDATA[Reply to Chunks in Datei schreiben und auslesen on Thu, 01 Nov 2007 15:27:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>das wird wohl daran liegen, dass nach dem erstenmal einlesen eof noch nicht gesetzt wurde. Wenn dann noch einmal eingelesen wirs, wird zwar eof gesetzt, du bist aber schon in der Schleife und in CH steht noch der alte Wert. Machs doch mal so</p>
<pre><code class="language-cpp">while(!feof(pFile))
{
    //Chunkheader lesen:
    fread(&amp;CH, sizeof(ChunkHeader), 1, pFile);
    if( !feof(pFile))
    {
      cout&lt;&lt;&quot;DRIN&quot;;
      if(CH.ChunkTyp == AUFGABEN)
      {
        fread(&amp;Anzahl, sizeof(DWORD), 1, pFile);
        for(i = 0; i &lt; Anzahl; i++)
        {
            fread(&amp;Grosse, sizeof(DWORD), 1, pFile);
            fread(actext, Grosse, 1, pFile);
            cout&lt;&lt;actext&lt;&lt;&quot;\n&quot;;
        }
      }
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1395938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395938</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 01 Nov 2007 15:27:30 GMT</pubDate></item><item><title><![CDATA[Reply to Chunks in Datei schreiben und auslesen on Thu, 01 Nov 2007 15:38:33 GMT]]></title><description><![CDATA[<p>Du kannst auch fread in die Schleifenbedingung packen. Wenn sich der Rückgabewert von fread vom dritten Parameter (in deinem Fall '1') unterscheidet, dann ist ein Fehler aufgetreten oder das Dateiende wurde erreicht:</p>
<pre><code class="language-cpp">while(fread(&amp;CH, sizeof(ChunkHeader), 1, pFile)==1)
{
      cout&lt;&lt;&quot;DRIN&quot;;
      if(CH.ChunkTyp == AUFGABEN)
      {
        fread(&amp;Anzahl, sizeof(DWORD), 1, pFile);
        for(i = 0; i &lt; Anzahl; i++)
        {
            fread(&amp;Grosse, sizeof(DWORD), 1, pFile);
            fread(actext, Grosse, 1, pFile);
            cout&lt;&lt;actext&lt;&lt;&quot;\n&quot;;
        }
      }
}
</code></pre>
<p>Guck dir auch diesen Artikel eventuell nochmal an:<br />
<a href="http://www.cplusplus.com/reference/clibrary/cstdio/fread.html" rel="nofollow">http://www.cplusplus.com/reference/clibrary/cstdio/fread.html</a><br />
Ansonsten würde ich eventuell eher die C++ Filestreams (fstream, ifstream, ofstream) benutzen.</p>
<p>Greetz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1395948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395948</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Thu, 01 Nov 2007 15:38:33 GMT</pubDate></item><item><title><![CDATA[Reply to Chunks in Datei schreiben und auslesen on Thu, 01 Nov 2007 15:40:59 GMT]]></title><description><![CDATA[<p>Hi vielen Dank für die Antworten, es läuft jetzt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1395951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395951</guid><dc:creator><![CDATA[Andreas_L]]></dc:creator><pubDate>Thu, 01 Nov 2007 15:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to Chunks in Datei schreiben und auslesen on Fri, 02 Nov 2007 00:26:35 GMT]]></title><description><![CDATA[<p>Hmm ... schonmal was von File Streams ufm. gehört?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1396169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1396169</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 02 Nov 2007 00:26:35 GMT</pubDate></item></channel></rss>