<?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[Binärdatei bearbeiten]]></title><description><![CDATA[<p>Zur späten Stunde gibt es noch ein Problem mit welchem ich gerade kämpfe.</p>
<p>Ich möchte eine Binärdatei öffnen und erhalte dabei nur kauderwelch.</p>
<p>nach dem FAQ zu den Datenströmen ist das einlesen sicherlich richtig aber das ausgeben auf dem Bildschirm ist nicht wie gewünscht.</p>
<pre><code>fstream FileBin(&quot;Testdatei1.gdi&quot;, ios::in|ios::binary);
if (FileBin.is_open())
{
    // 1. Dateigröße bestimmen.
    FileBin.seekg(0, ios::end);
    unsigned long FileSize = streamoff(FileBin.tellg());
    FileBin.seekg(0, ios::beg);

    // 2. Puffer anlegen und Datei einlesen.
    char* pBuffer = new char[FileSize];
    FileBin.read(pBuffer, FileSize);

	for(int i = 0; i &lt; FileSize; i++){
		cout &lt;&lt; pBuffer[i];
	}

    // Nachher wieder aufräumen.
    delete [] pBuffer;
}
</code></pre>
<p>Ich möchte einen Dank an die Leute aussprechen die mich bisher mir Rat und Tat bei Seite standen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200212/binärdatei-bearbeiten</link><generator>RSS for Node</generator><lastBuildDate>Sun, 04 Oct 2026 19:18:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200212.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Dec 2007 01:39:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 01:39:00 GMT]]></title><description><![CDATA[<p>Zur späten Stunde gibt es noch ein Problem mit welchem ich gerade kämpfe.</p>
<p>Ich möchte eine Binärdatei öffnen und erhalte dabei nur kauderwelch.</p>
<p>nach dem FAQ zu den Datenströmen ist das einlesen sicherlich richtig aber das ausgeben auf dem Bildschirm ist nicht wie gewünscht.</p>
<pre><code>fstream FileBin(&quot;Testdatei1.gdi&quot;, ios::in|ios::binary);
if (FileBin.is_open())
{
    // 1. Dateigröße bestimmen.
    FileBin.seekg(0, ios::end);
    unsigned long FileSize = streamoff(FileBin.tellg());
    FileBin.seekg(0, ios::beg);

    // 2. Puffer anlegen und Datei einlesen.
    char* pBuffer = new char[FileSize];
    FileBin.read(pBuffer, FileSize);

	for(int i = 0; i &lt; FileSize; i++){
		cout &lt;&lt; pBuffer[i];
	}

    // Nachher wieder aufräumen.
    delete [] pBuffer;
}
</code></pre>
<p>Ich möchte einen Dank an die Leute aussprechen die mich bisher mir Rat und Tat bei Seite standen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419107</guid><dc:creator><![CDATA[MarcR]]></dc:creator><pubDate>Wed, 12 Dec 2007 01:39:00 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 01:46:32 GMT]]></title><description><![CDATA[<p>Was erwartest du? Die binären Daten werden eben entsprechend dem aktuellen Encoding interpretiert. Wenn es sich dabei also nicht um Text handelst, wirst alle möglichen Zeichen sehen.</p>
<p>Mittels</p>
<pre><code class="language-cpp">cout &lt;&lt; hex &lt;&lt; (int)pBuffer[i] &lt;&lt; ' ';
</code></pre>
<p>kannst du dir die Hexwerte der Bytes anschauen (wie bei einem Hexeditor).</p>
<p>Im Übrigen kannst du bei Binärdateien nicht mittels seek/tellg die Dateilänge bestimmen!</p>
<p>PS. manuelles rumspielen mit new/delete ist sehr gefährlich. Benutz lieber einen Container oder Smartpointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419108</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Wed, 12 Dec 2007 01:46:32 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 01:56:16 GMT]]></title><description><![CDATA[<p>hmm,</p>
<p>eigentlich sollte der Inhalt ungefähr so aussehen:</p>
<p>- die erste Zahl ist eine Integer und<br />
- dann durch leerzeichen getrennte float-Zahlen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419110</guid><dc:creator><![CDATA[MarcR]]></dc:creator><pubDate>Wed, 12 Dec 2007 01:56:16 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 02:24:42 GMT]]></title><description><![CDATA[<p>und die bits werden eben als Zeichen interpretiert =&gt; da kommt Chaos raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419112</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Wed, 12 Dec 2007 02:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 06:39:02 GMT]]></title><description><![CDATA[<p>MarcR schrieb:</p>
<blockquote>
<p>hmm,</p>
<p>eigentlich sollte der Inhalt ungefähr so aussehen:</p>
<p>- die erste Zahl ist eine Integer und<br />
- dann durch leerzeichen getrennte float-Zahlen</p>
</blockquote>
<p>Das ist aber nicht wirklich binär <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="😉"
    /> (unter &quot;Binärdatei&quot; verstehen die meisten hier, wenn du deine Daten in dem Format speicherst, in dem sie im Rechner verwaltet werden)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419121</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 12 Dec 2007 06:39:02 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 11:44:50 GMT]]></title><description><![CDATA[<p>Ich war so frei und habe mal die Datei um die es mir geht hochgeladen.</p>
<pre><code class="language-html">http://home.arcor.de/reichert13/Test1.dat
</code></pre>
<p>Die Datei Test1.dat:<br />
- enthält binär ausgegebene Zahlenwerte<br />
- der erste ist ein Integer-Wert und gibt die Anzahl der nachfolgenden Floatwerte an</p>
<p>Mit dem Integer-Wert dimensioniere ich ein Float Array. Nun möchte ich die nachfolgenden Float-Zahlen in ein Float-Vektor lesen.</p>
<pre><code>FILE *pfile;

	int size;

	if ( fopen_s( &amp;pfile, &quot;Test1.dat&quot;, &quot;rb&quot; ) != 0 )

		fprintf( stderr, &quot;Trouble opening file\n&quot; );

	else

	{

	if ( !feof(pfile) ) fscanf_s(pfile, &quot;%d&quot;, &amp;size);
	if ( !ferror(pfile) &amp;&amp; size &gt; 0 )
			{

		cout &lt;&lt; size &lt;&lt; endl;

		float* pArr = new float[size];

/* ---------- ab hier hapert es --------------------------------- 

    	for (unsigned int ix = 0; ix &lt; size &amp;&amp; !feof(pfile); ix++)
		{
			fscanf_s(pfile, &quot;%d&quot;, &amp;pArr[ix]);
			cout &lt;&lt; pArr[ix] &lt;&lt; endl;
		}

-------------------------------------------------------------------- */
	}
	fclose( pfile );
	}
</code></pre>
<p>Also wenn ich die Datei so öffne ist der erste Integerwert bei mir = 4198489.<br />
Mit dem das Array dimensioniert wird. Mein Bauch verrät mir, der Wert könnte etwas zu groß sein. Oder?</p>
<p>Wie komme ich dann sinnvolerweise an die floatwerte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419262</guid><dc:creator><![CDATA[MarcR]]></dc:creator><pubDate>Wed, 12 Dec 2007 11:44:50 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 11:53:43 GMT]]></title><description><![CDATA[<p>*wirft einen kurzen Blick in die Datei* ja, eindeutig Binärdaten. Da wird fscanf() wohl kaum etwas sinnvolles rauslesen können - sowas liest man mit fread() bzw. istream::read() ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419267</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 12 Dec 2007 11:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 11:55:18 GMT]]></title><description><![CDATA[<p>2 kurze fragen (nicht böse gemeint):</p>
<p>Hast du dich mit dem Thema überhaupt näher befasst?</p>
<p>Verstehst du auch, was du da programmierst oder &quot;kopierst&quot; du nur code?</p>
<p>Ich werd später wenn ich Zeit hab das evtl. mal versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419269</guid><dc:creator><![CDATA[XaTrIxX]]></dc:creator><pubDate>Wed, 12 Dec 2007 11:55:18 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 12:27:22 GMT]]></title><description><![CDATA[<p>Der Gedanke mit fread kam mir auch. Das Problem bzw. die Eigenschaft von fread ist ein Blockweises auslesen. Allerdings finde ich dort auf anhieb keinen passenden Ansatzpunkt.</p>
<p>- wenn ich in festen Blöcken springe, laufe ich gefahr das ich 2 Float-Werte zusammen in einem Block habe</p>
<p>ich schau mal wie weit ich mit fread komme.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10469">@XaTrIxX</a> ich nehme es dir nicht böse. Deine Aussage bezieht sich sicherlich auf die for()-Schleife, auch zurecht. Aber dieses war nur ein Versuch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419299</guid><dc:creator><![CDATA[MarcR]]></dc:creator><pubDate>Wed, 12 Dec 2007 12:27:22 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 12:34:04 GMT]]></title><description><![CDATA[<p>Bei fread kannst du auch angeben, wie groß der einzulesende Block werden soll - und da gibt man natürlich die Größe an, die man tatsächlich erwartet (sagt dir sizeof() etwas?).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419306</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 12 Dec 2007 12:34:04 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 13:40:00 GMT]]></title><description><![CDATA[<p>Als erstes öffnen wir einen Datei-Stream. Binär, so steht es ja nunmal in der Datei (Warum eigtl.?). Ob das nun geklappt hat, sollte man auch überprüfen.</p>
<pre><code class="language-cpp">std::ifstream file_stream(&quot;Test1.dat&quot;, std::ios::binary);
if (!file_stream) throw std::runtime_error(&quot;could not open file \&quot;test1.dat\&quot;&quot;);
</code></pre>
<p>Das ist ja schonmal ein Anfang. Jetzt mal versuchen die Ganzzahl auszulesen (Was um Himmelswillen ist ein &quot;Integer-Wert&quot; in dieser Satzkonstruktion? &quot;Integer&quot; = &quot;Ganzzahl&quot;)! Ein Array kann aber natürlich nur eine <strong>positive</strong> Anzahl an Elementen haben. In der Annahme, dass der Macher der Datei einen hinreichenden Kenntnisstand hatte, lesen wir also einen unsignierte (ohne +/-) Ganzzahl ein.<br />
Wie schon erwähnt, <strong>versuchen</strong> wir das ganze, von d.h. sollten wir auch gucken ob es geklappt hat!</p>
<pre><code class="language-cpp">unsigned int arr_size(0);
file_stream.read(reinterpret_cast&lt;char*&gt;(&amp;arr_size), sizeof(unsigned int));
if (!file_stream) throw std::runtime_error(&quot;\&quot;test1.dat\&quot; is corrupted&quot;);
</code></pre>
<p>Jetzt sollen ganz viele Fließkommazahlen(float's) kommen. Also legen wir schonmal einen Array an oder nehmen einen Container-Typ des Standards, und reservieren genügend Speicher.</p>
<pre><code class="language-cpp">float* arr_data(new float[arr_size]);
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">std::vector&lt;float&gt; arr_data(arr_size);
</code></pre>
<p>.</p>
<p>Ein leerer Array hilft nur wenig, also kommen jetzt die Daten. Wenn nun aber irgendwas mit den Daten in der Datei nicht stimmt, kann man zum einen hingehen, und sagen, dass die Datei beschädigt ist, oder hingehen und einen Standardwert nehmen.</p>
<pre><code class="language-cpp">for (unsigned int i(0); i &lt; arr_size; ++i)
{
    file_stream.read(reinterpret_cast&lt;char*&gt;(&amp;arr_data[i]), sizeof(float));
    if (!file_stream) std::runtime_error(&quot;\&quot;test1.dat\&quot; is corrupted&quot;);
}
</code></pre>
<pre><code class="language-cpp">for (unsigned int i(0); i &lt; arr_size; ++i)
{
    file_stream.read(reinterpret_cast&lt;char*&gt;(&amp;arr_data[i]), sizeof(float));
    if (!file_stream) { file_stream.clear(); arr_data[i] = 0.0f; }
}
</code></pre>
<p>.</p>
<p>Jetzt haben wir alle Daten und sind glücklich!<br />
Wenn wir uns am Anfang nicht für den Standardcontainer entschieden haben, sondern lieber selbst per new[] einen Array erzeugt haben, müssen wir diesen am Ende nochmal freigeben.</p>
<pre><code class="language-cpp">delete [] arr_data;
</code></pre>
<p>.</p>
<p>Und das war es auch schon <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="🙂"
    /> Hoffe, das du jetzt nicht nur kopiert (dann klappt der Code übrigens nicht!) sondern es auch verstehst!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419348</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 12 Dec 2007 13:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 13:58:19 GMT]]></title><description><![CDATA[<p>hmm, ich hab es etwas erweitert. Dabei habe ich einen neuen Integer-Wert am Anfang ausgelesen der, wie ich finde passender sein könnte.</p>
<p>Wenn ich die *.dat in einen Hexeditor lade, ist der erste Wert die 13. Daraus folgt das wenn man den Hex-Wert umrechnet die erste zahl eine Dezimal 19 sein müßte.</p>
<p>Könnte das stimmen?</p>
<p>Demzufolge hätte erstmal mein Float-Array eine größe von 19.</p>
<pre><code>FILE *pfile;
	fpos_t pos;

	int size[1];
	float buffer[40];

	if ( fopen_s( &amp;pfile, &quot;Test1.dat&quot;, &quot;rb&quot; ) != 0 )

		fprintf( stderr, &quot;Trouble opening file\n&quot; );

	else

	{

			fread(size, sizeof( int ), 2, pfile );
			if ( fgetpos( pfile, &amp;pos ) != 0 )
				printf( &quot;fgetpos error&quot; );

		float* pArr = new float[static_cast&lt;int&gt;(size[0])];
			cout &lt;&lt; &quot;\n\n--&gt;&gt; &quot; &lt;&lt; size[0] &lt;&lt; endl;

			if ( fsetpos( pfile, &amp;pos ) != 0 )
				printf( &quot;fsetpos error&quot; );
				fread( buffer, sizeof( float ), 19, pfile );

				fclose( pfile );

                 for(int i = 0; i &lt; 19; i++)
                     cout &lt;&lt; &quot; &quot; &lt;&lt; pArr[i];

	}
</code></pre>
<p>Hmm, so sieht es momentan bei mir aus. Bin mir nicht sicher ob ich richtig bin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419368</guid><dc:creator><![CDATA[MarcR]]></dc:creator><pubDate>Wed, 12 Dec 2007 13:58:19 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 14:08:34 GMT]]></title><description><![CDATA[<p>MarcR schrieb:</p>
<blockquote>
<p>Wenn ich die *.dat in einen Hexeditor lade, ist der erste Wert die 13. Daraus folgt das wenn man den Hex-Wert umrechnet die erste zahl eine Dezimal 19 sein müßte.</p>
<p>Könnte das stimmen?</p>
</blockquote>
<p>Ein int hat typischerweise die Größe von 4 Byte - d.h. du müsstest die ersten 4 Byte zusammenfassen, um die Arraygröße vergleichen zu können.</p>
<p>PS: Warum verwendest du nicht den Lösungsansatz, den (D)Evil präsentiert hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419379</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 12 Dec 2007 14:08:34 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 14:28:32 GMT]]></title><description><![CDATA[<p>Interessant. Ich sass noch an dem Beitrag als Devil schon gepostet hat, deswegen konnte ich mir das noch nicht ansehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419401</guid><dc:creator><![CDATA[MarcR]]></dc:creator><pubDate>Wed, 12 Dec 2007 14:28:32 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 19:38:51 GMT]]></title><description><![CDATA[<p>Ich bedanke mich recht herzlich.</p>
<p>Dank Devils Vorschlag habe ich einen guten Vergleich der Endresultate.</p>
<p>Mir ist aufgefallen das bei dem Vorschlag den ich kurz vor Devil gepostet habe die erste Float fehlt(die erste Float nach dem Integer ). Diese wird mir nicht ausgegeben? während sie bei der Variante von Devil schön da steht.</p>
<p>Woran kann das liegen? Springe ich mit dem zeiger vorbei?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419614</guid><dc:creator><![CDATA[MarcR]]></dc:creator><pubDate>Wed, 12 Dec 2007 19:38:51 GMT</pubDate></item><item><title><![CDATA[Reply to Binärdatei bearbeiten on Wed, 12 Dec 2007 19:58:39 GMT]]></title><description><![CDATA[<p>Naja dein Code ist C ... solltest du unter C++ eh meiden, aber nun zu deinem Fehler. Guck dir evtl. mal <a href="http://www.cppreference.com/stdio/fread.html" rel="nofollow">http://www.cppreference.com/stdio/fread.html</a> an. du ließt ein:</p>
<pre><code class="language-cpp">fread(size, sizeof( int ), 2, pfile );
</code></pre>
<p>Naja, sowas:</p>
<pre><code class="language-cpp">int size[1];
</code></pre>
<p>ist nicht soo die feine Art.</p>
<pre><code class="language-cpp">unsigned int size;
// ...
fread(&amp;size, sizeof(unsigned int), 1, pFile);
</code></pre>
<p>Dann</p>
<pre><code class="language-cpp">float* pArr = new float[static_cast&lt;int&gt;(size[0])];
</code></pre>
<p>. Hier ist der static_cast überflüssig, da du eh einen int zurück gebkommst. size[0] =&gt; int. Ein *size tut es in dem Fall aber auch. Wenn du aber direkt einfach size als unsigned int (NICHT als Array) anlegst, hast du da einfach size stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419631</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 12 Dec 2007 19:58:39 GMT</pubDate></item></channel></rss>