<?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[Daten kombinieren bei Verwendung von Pragma Pack und Struct?]]></title><description><![CDATA[<p>Ich lese eine Datendatei mit verschiedenen Datensätzen mittels pragma pack und struct in C++ ein, konvertiere die verschiedenen Datentypen zu Dezimal wenn nötig und gebe die gesamte Datendatei mit allen verschiedenen Datensätzen als Klartext-Textdatei aus. Das klappt im Wesentlichen ganz prima, ich scheitere aber vollkommen bei dem Versuch einzelne Daten vor der Ausgabe zu kombinieren.</p>
<p>Als vereinfachtes Beispiel:</p>
<p>Datenpaket 1 enthält als Text einen Städtenamen, gefolgt von Einwohnerzahl und Größe. Enthalten sind zahlreiche Datenreihen bzw. Städte.</p>
<p>0 Berlin;111;111<br />
1 Düsseldorf;111;2222<br />
2 Wien;1111;1234<br />
3 Dortmund;333;4444<br />
4 ...</p>
<pre><code class="language-cpp">struct TStadt
{
	char				mName[64];		 
	unsigned char		mData1[4];			  
	unsigned char		mData2[4];			
};
</code></pre>
<p>Datenpaket 2 kann z.B. verschiedene Straßendaten enthalten und einen Verweis auf die Stadt, in Form der Datenreihennummer aus Datenpaket 1.</p>
<p>0 3;1;3568:458<br />
1 3;4;4586;3<br />
2 2;75;474;1<br />
3 ...</p>
<pre><code class="language-cpp">struct TStrassen
{
	short				mStaedteIndex;		  // Stadt 
	short				mStrasseIndex;       
	int					mSumTSData;           
	short				mNbTSData;	          
 };
</code></pre>
<p>Ich möchte vor der Datenausgabe den Datensatz des 2ten Paketes um den tatsächlichen Stadtnamen ergänzen, scheitere aber jedes mal kläglich. Geht das überhaupt bei meiner Einlesemethode?</p>
<p>Ziel:</p>
<p>0 Dortmund;1;3568:458<br />
1 Dortmund;4;4586;3<br />
2 Wien;75;474;1<br />
3 ...</p>
<p>Meine Datendateien sind riesig und auch mein komplettes Script ist recht lang, daher kann ich nicht alles posten oder hochladen. Ich möchte am Ende auch einige Verknüpfungen mehr in der Datei machen als nur die eine da oben.</p>
<p>Vielleicht sollte ich noch einen Teil des scripts posten mit dem ich die Einlese und später dann die Textausgabe vornehme:</p>
<pre><code class="language-cpp">// Einlesen 1. Teil - Städte (786432DEZ / C0000HEX Datensatzlänge)
void readStadt(FILE* pFile, TMapDAT&amp; pMap)
{
	int	lNbStaedte = pMap.mHeader.mLumpes[cStadtLump].mLength / sizeof(TStadt);

	// Zum Datenbeginn springen 
	fseek(pFile, pMap.mHeader.mLumpes[cStadtLump].mOffset, SEEK_SET);

	for
		(int lStadtCounter = 0; lStadtCounter &lt; lNbStaedte; ++lStadtCounter)
	{
		TStadt lStadt;

		fread(&amp;lStadt, 1, sizeof(TStadt), pFile);

		pMap.mStaedte.push_back(lStadt);
	}
}
</code></pre>
<p>P.S.: Hobbybasteler am Werk... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263399/daten-kombinieren-bei-verwendung-von-pragma-pack-und-struct</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 00:11:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263399.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 20 Mar 2010 10:42:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Daten kombinieren bei Verwendung von Pragma Pack und Struct? on Sat, 20 Mar 2010 10:42:22 GMT]]></title><description><![CDATA[<p>Ich lese eine Datendatei mit verschiedenen Datensätzen mittels pragma pack und struct in C++ ein, konvertiere die verschiedenen Datentypen zu Dezimal wenn nötig und gebe die gesamte Datendatei mit allen verschiedenen Datensätzen als Klartext-Textdatei aus. Das klappt im Wesentlichen ganz prima, ich scheitere aber vollkommen bei dem Versuch einzelne Daten vor der Ausgabe zu kombinieren.</p>
<p>Als vereinfachtes Beispiel:</p>
<p>Datenpaket 1 enthält als Text einen Städtenamen, gefolgt von Einwohnerzahl und Größe. Enthalten sind zahlreiche Datenreihen bzw. Städte.</p>
<p>0 Berlin;111;111<br />
1 Düsseldorf;111;2222<br />
2 Wien;1111;1234<br />
3 Dortmund;333;4444<br />
4 ...</p>
<pre><code class="language-cpp">struct TStadt
{
	char				mName[64];		 
	unsigned char		mData1[4];			  
	unsigned char		mData2[4];			
};
</code></pre>
<p>Datenpaket 2 kann z.B. verschiedene Straßendaten enthalten und einen Verweis auf die Stadt, in Form der Datenreihennummer aus Datenpaket 1.</p>
<p>0 3;1;3568:458<br />
1 3;4;4586;3<br />
2 2;75;474;1<br />
3 ...</p>
<pre><code class="language-cpp">struct TStrassen
{
	short				mStaedteIndex;		  // Stadt 
	short				mStrasseIndex;       
	int					mSumTSData;           
	short				mNbTSData;	          
 };
</code></pre>
<p>Ich möchte vor der Datenausgabe den Datensatz des 2ten Paketes um den tatsächlichen Stadtnamen ergänzen, scheitere aber jedes mal kläglich. Geht das überhaupt bei meiner Einlesemethode?</p>
<p>Ziel:</p>
<p>0 Dortmund;1;3568:458<br />
1 Dortmund;4;4586;3<br />
2 Wien;75;474;1<br />
3 ...</p>
<p>Meine Datendateien sind riesig und auch mein komplettes Script ist recht lang, daher kann ich nicht alles posten oder hochladen. Ich möchte am Ende auch einige Verknüpfungen mehr in der Datei machen als nur die eine da oben.</p>
<p>Vielleicht sollte ich noch einen Teil des scripts posten mit dem ich die Einlese und später dann die Textausgabe vornehme:</p>
<pre><code class="language-cpp">// Einlesen 1. Teil - Städte (786432DEZ / C0000HEX Datensatzlänge)
void readStadt(FILE* pFile, TMapDAT&amp; pMap)
{
	int	lNbStaedte = pMap.mHeader.mLumpes[cStadtLump].mLength / sizeof(TStadt);

	// Zum Datenbeginn springen 
	fseek(pFile, pMap.mHeader.mLumpes[cStadtLump].mOffset, SEEK_SET);

	for
		(int lStadtCounter = 0; lStadtCounter &lt; lNbStaedte; ++lStadtCounter)
	{
		TStadt lStadt;

		fread(&amp;lStadt, 1, sizeof(TStadt), pFile);

		pMap.mStaedte.push_back(lStadt);
	}
}
</code></pre>
<p>P.S.: Hobbybasteler am Werk... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871567</guid><dc:creator><![CDATA[MS-Office-User]]></dc:creator><pubDate>Sat, 20 Mar 2010 10:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to Daten kombinieren bei Verwendung von Pragma Pack und Struct? on Sat, 20 Mar 2010 11:19:53 GMT]]></title><description><![CDATA[<p>Dein Einlesen ist C und nicht C++<br />
<a href="http://www.cplusplus.com/reference/iostream/fstream/" rel="nofollow">http://www.cplusplus.com/reference/iostream/fstream/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871576</guid><dc:creator><![CDATA[wx++]]></dc:creator><pubDate>Sat, 20 Mar 2010 11:19:53 GMT</pubDate></item><item><title><![CDATA[Reply to Daten kombinieren bei Verwendung von Pragma Pack und Struct? on Wed, 07 Apr 2010 07:37:24 GMT]]></title><description><![CDATA[<p>wx++ schrieb:</p>
<blockquote>
<p>Dein Einlesen ist C und nicht C++<br />
<a href="http://www.cplusplus.com/reference/iostream/fstream/" rel="nofollow">http://www.cplusplus.com/reference/iostream/fstream/</a></p>
</blockquote>
<p>Ich glaube ich bin zu dumm dafür. Was ich auch versuche um die Daten zu kombinieren endet in Fehlern und crashes. Ich hab mir extra erst mal eine kleine Datendtei gebaut und die ganzen scripts angepasst und verkleinert um mehr Übersicht zu haben und selbst damit komm ich nicht weiter. Aber ganz nebenbei, ich have CPP und h-Dateien erstellt, also ist das doch C++ und nicht C - oder? <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/1878616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878616</guid><dc:creator><![CDATA[MS-Office-User]]></dc:creator><pubDate>Wed, 07 Apr 2010 07:37:24 GMT</pubDate></item><item><title><![CDATA[Reply to Daten kombinieren bei Verwendung von Pragma Pack und Struct? on Wed, 07 Apr 2010 08:58:24 GMT]]></title><description><![CDATA[<p>MS-Office-User schrieb:</p>
<blockquote>
<p>Ich lese eine Datendatei mit verschiedenen Datensätzen mittels pragma pack und struct in C++ ein, ...</p>
<p>0 Berlin;111;111<br />
1 Düsseldorf;111;2222<br />
2 Wien;1111;1234<br />
3 Dortmund;333;4444<br />
4 ...</p>
<pre><code class="language-cpp">struct TStadt
{
	char				mName[64];		 
	unsigned char		mData1[4];			  
	unsigned char		mData2[4];			
};
</code></pre>
<p>...</p>
</blockquote>
<p>Als Erstes fällt mir auf, dass in Deinem Beispiel die Daten unterschiedliche Länge haben (Städtenamen) - berücksichtigt Deine Einleseroutine das?<br />
Als Zweites, dass Du nicht die (praktischen, sicheren, ...) C++-Mittel verwendest:<br />
string, ifstream, operator&gt;&gt;(), vector, map, ...</p>
<p>und schließlich, dass ich keine Fehlerbeschreibung in Deinem Text finde (du &quot;scheiterst&quot;?!?, Was meinst Du mit &quot;Verknüpfung&quot;?</p>
<p>Ich skizziere mal kurz, wie <em>ich</em> so ein Einlesen normalerweise löse:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
using std::ifstream;

#include &lt;string&gt;
using std::string;

#include &lt;vector&gt;
using std::vector;

#include &lt;iostream&gt;
using std::cout;

struct Stadt
{
    string name;         
    long data1, data2; // sind doch nur Zahlen, oder?
};

int main() {
   ifstream in(&quot;MeineDatei.txt&quot;);
   vector&lt;Stadt&gt; staedte;
   while(in) {
      Stadt stadt;
      char trenner;
      in &gt;&gt; stadt.name;
      in &gt;&gt; trenner; // Semikolon überspringen
      in &gt;&gt; stadt.data1; 
      in &gt;&gt; trenner; // Semikolon überspringen
      in &gt;&gt; stadt.data2; 
      in &gt;&gt; trenner; // Semikolon überspringen
      staedte.push_back(stadt);
   }
   // Ab hier kann ich auf die n. Stadt mittels staedte[n-1] zugreifen ...

   // Hier z.B. einfach Ausgabe auf die Konsole
   for(size_t i=0; i&lt;staedte.size(); ++i) 
      cout &lt;&lt; i &lt;&lt; &quot;. Stadt: name = &quot; &lt;&lt; staedte[i].name &lt;&lt; &quot;, data1 = &quot; &lt;&lt; staedte[i].data1  &lt;&lt; &quot;, data2 = &quot; &lt;&lt; staedte[i].data2 &lt;&lt; &quot;\n&quot;;
   return 0;
};
</code></pre>
<p>Da kann man natürlich noch eine Menge verbessern (operator&gt;&gt;(Stadt&amp;) , zeilenweise einlesen, Trennerhandling besser, operator&lt;&lt;() passend dazu, Fehlertoleranz (gerade bei großen Files wichtig), Ausgabe via iterator, ....), aber schon mit der einfachen Variante bekommst Du ein recht gute Fehlerbehandlung (z.B. String-Längen), einen Typkonvertierung, leichte Erweiterbarkeit, Übersichtlichkeit... geschenkt.</p>
<p>Kann es sein, dass Du ein &quot;Datenmodell in C++&quot; abzubilden versuchst? (&quot;Index&quot;, &quot;Verknüpfung&quot;, ... weisen für mich darauf hin) Dann solltest Du Dir unbedingt die StdLib-Container intensiv ansehen (&quot;draufschaffen&quot;) und in 99,9% der Fälle auch verwenden!</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1878675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878675</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 07 Apr 2010 08:58:24 GMT</pubDate></item></channel></rss>