<?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[null-terminierte Konfusion]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Zunächst einmal - dies ist mein erster Post hier, also ein sehr denkwürdiges und emotionales Ereignis für mich, das meine spätere Entwicklung in diesem Forum maßgeblich beeinflussen kann und wird - deshalb bitte ich darum, keine Texte zu verfassen, die ein evenvuelle späterer Traumata verursachen könnten.</p>
<p>Naja.. im Ernst, ich würde mich sehr gern mit einer Frage an Euch wenden, die ich mir selbst nicht so ganz beantworten kann.</p>
<p>Und zwar geht es um Folgendes:</p>
<p>Ich möchte n Bytes aus einer Datei auslesen, die einen String repräsentieren. Dazu nutze ich fread(). Da der String in der Datei selbst nicht null-terminiert ist, füge ich den Terminator nach dem Einlesen der Bytes aus der Datei zusätzlich hinten an. Das Ganze sieht dann ungefähr so aus:</p>
<pre><code>char*buf=(char*)malloc(length+1);
fread(&amp;buf[0], length, 1,m_file);
buf[length]='\0';

printf(&quot;String: %s&quot;, buf);
</code></pre>
<p>Leider wird der String am Ende nicht korrekt ausgegeben, genauer genommen gar nicht. Wenn ich allerdings die einzelnen Array-Positionen in einer Schleife ausgebe, dann sehe ich, daß die einzelnen Chars richtig eingelesen wurden aus der Datei.</p>
<p>Im Moment umgehe ich das Problem folgendermaßen:</p>
<pre><code>char*buf=(char*)malloc(length);
char*result=new char[length];
sprintf(result,&quot;&quot;);
fread(&amp;buf[0], length, 1,m_file);

for(int i=0;i&lt;length;i++)
    sprintf(result, &quot;%s%c&quot;, result, buf[i]);

return result;
</code></pre>
<p>Ich lese also den Dateiinhalt in <strong>buf</strong> ein und kopiere ihn dann wiederum Byte für Byte nach <strong>result</strong>. Funktioniert zwar, ist aber nicht das Gelbe vom Ei. Lieber wäre mir die o.g. Lösung.</p>
<p>Daher meine Frage an Euch: Könnt ihr mir da vielleicht weiterhelfen?</p>
<p>Vielen Dank für jede Hilfe!</p>
<p>TdZ</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/188170/null-terminierte-konfusion</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 02:03:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/188170.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Jul 2007 12:14:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to null-terminierte Konfusion on Fri, 27 Jul 2007 12:14:18 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Zunächst einmal - dies ist mein erster Post hier, also ein sehr denkwürdiges und emotionales Ereignis für mich, das meine spätere Entwicklung in diesem Forum maßgeblich beeinflussen kann und wird - deshalb bitte ich darum, keine Texte zu verfassen, die ein evenvuelle späterer Traumata verursachen könnten.</p>
<p>Naja.. im Ernst, ich würde mich sehr gern mit einer Frage an Euch wenden, die ich mir selbst nicht so ganz beantworten kann.</p>
<p>Und zwar geht es um Folgendes:</p>
<p>Ich möchte n Bytes aus einer Datei auslesen, die einen String repräsentieren. Dazu nutze ich fread(). Da der String in der Datei selbst nicht null-terminiert ist, füge ich den Terminator nach dem Einlesen der Bytes aus der Datei zusätzlich hinten an. Das Ganze sieht dann ungefähr so aus:</p>
<pre><code>char*buf=(char*)malloc(length+1);
fread(&amp;buf[0], length, 1,m_file);
buf[length]='\0';

printf(&quot;String: %s&quot;, buf);
</code></pre>
<p>Leider wird der String am Ende nicht korrekt ausgegeben, genauer genommen gar nicht. Wenn ich allerdings die einzelnen Array-Positionen in einer Schleife ausgebe, dann sehe ich, daß die einzelnen Chars richtig eingelesen wurden aus der Datei.</p>
<p>Im Moment umgehe ich das Problem folgendermaßen:</p>
<pre><code>char*buf=(char*)malloc(length);
char*result=new char[length];
sprintf(result,&quot;&quot;);
fread(&amp;buf[0], length, 1,m_file);

for(int i=0;i&lt;length;i++)
    sprintf(result, &quot;%s%c&quot;, result, buf[i]);

return result;
</code></pre>
<p>Ich lese also den Dateiinhalt in <strong>buf</strong> ein und kopiere ihn dann wiederum Byte für Byte nach <strong>result</strong>. Funktioniert zwar, ist aber nicht das Gelbe vom Ei. Lieber wäre mir die o.g. Lösung.</p>
<p>Daher meine Frage an Euch: Könnt ihr mir da vielleicht weiterhelfen?</p>
<p>Vielen Dank für jede Hilfe!</p>
<p>TdZ</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1333969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1333969</guid><dc:creator><![CDATA[TdZ]]></dc:creator><pubDate>Fri, 27 Jul 2007 12:14:18 GMT</pubDate></item><item><title><![CDATA[Reply to null-terminierte Konfusion on Fri, 27 Jul 2007 12:41:15 GMT]]></title><description><![CDATA[<p>Es tut mir leid das schreiben zu müssen, aber der Code von dir ist kein bisschen C++, sondern reines C^^<br />
Dementsprechend gehört er auch in ein anderes Forum, wo ein Mod ihn sicher bald verschieben wird^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1333997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1333997</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Fri, 27 Jul 2007 12:41:15 GMT</pubDate></item><item><title><![CDATA[Reply to null-terminierte Konfusion on Fri, 27 Jul 2007 12:36:16 GMT]]></title><description><![CDATA[<p>Ich kann in deinem oberen Code keinen Fehler entdecken. Kannst du ein bisschen mehr Code posten, vorallem, wie du die Datei öffnest?<br />
Noch ein paar HInweise:</p>
<pre><code class="language-cpp">fread(&amp;buf[0], length, 1,m_file);
</code></pre>
<p>ist aufgrund der Natur von Arrays in C gleichbedeutend mit</p>
<pre><code class="language-cpp">fread(buf, length, 1,m_file);
</code></pre>
<p>Diese beiden Zeilen machen exakt das gleiche:</p>
<pre><code class="language-cpp">char*buf=(char*)malloc(length);
char*result=new char[length];
</code></pre>
<p>Die erste ist die C-Variante, die zweite das Equivalent in C++.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15080">@The-Kenny</a>: Durch das &quot;new&quot; wird's doch zu C++ <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1333999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1333999</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Fri, 27 Jul 2007 12:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to null-terminierte Konfusion on Sun, 29 Jul 2007 06:55:09 GMT]]></title><description><![CDATA[<p>Sorry, daß ich jetzt erst antworte, aber ich hatt in den letzten Tagen Probleme, den Server hier zu erreichen.</p>
<p>@TheKenny<br />
Stimmt, da hast du eigentlich recht. Ich hab ehrlich gesagt nur nicht drauf geachtet, weil das Projekt ansich in C++ gehalten ist, bis auf einige (plattformspezifisch in C gehaltene) Ausnahmen. Trotzdem, mein Fehler.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16275">@JimmydaMage</a><br />
Eigentlich ist das alles an Code, der relevant wäre. Davor kommt einzig noch ein</p>
<pre><code>fopen(filename,&quot;rb&quot;);
</code></pre>
<p>Benutze jetzt immernoch diesen vermkurksten Code, daher hoffe ich, euch fällt vielleicht noch was ein. Ich jedenfalls bin nach wie vor ratlos was das angeht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334176</guid><dc:creator><![CDATA[TdZ]]></dc:creator><pubDate>Sun, 29 Jul 2007 06:55:09 GMT</pubDate></item><item><title><![CDATA[Reply to null-terminierte Konfusion on Sun, 29 Jul 2007 09:12:30 GMT]]></title><description><![CDATA[<p>TdZ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char*buf=(char*)malloc(length);
char*result=new char[length];
sprintf(result,&quot;&quot;);
fread(&amp;buf[0], length, 1,m_file);

for(int i=0;i&lt;length;i++)
    sprintf(result, &quot;%s%c&quot;, result, buf[i]);

return result;
</code></pre>
</blockquote>
<p>Ich verstehe nicht ganz, was du erreichen willst... Also soll der Dateiinhalt in &quot;buf&quot; und in &quot;result&quot; drinstehen?<br />
Egal wie, aber das char-weise kopieren sollte auf jeden Fall so</p>
<pre><code class="language-cpp">for ( int i=0; i&lt;length+1; i++ )
    result[i] = buf[i];
</code></pre>
<p>oder so</p>
<pre><code class="language-cpp">memcpy( result, buf, length+1 );
</code></pre>
<p>aussehen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334208</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sun, 29 Jul 2007 09:12:30 GMT</pubDate></item><item><title><![CDATA[Reply to null-terminierte Konfusion on Sun, 29 Jul 2007 09:58:19 GMT]]></title><description><![CDATA[<p>was für eine datei öffnest du denn? ein normales textfile oder ne .exe oder ...? weil bei vielen gibts vornedran noch header, die schon nullbytes enthalten können und den string deshalb abschneiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334228</guid><dc:creator><![CDATA[~eddi~]]></dc:creator><pubDate>Sun, 29 Jul 2007 09:58:19 GMT</pubDate></item><item><title><![CDATA[Reply to null-terminierte Konfusion on Sun, 29 Jul 2007 18:23:33 GMT]]></title><description><![CDATA[<p>Schau dir am besten mal im Debuuger an, wie buf nach dem Anhängen des Nullbytes aussieht. Das beschriebene Verhalten klingt danach, dass in der Datei vor der String noch ein Nullbyte steht...</p>
<p>GRüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334499</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Sun, 29 Jul 2007 18:23:33 GMT</pubDate></item><item><title><![CDATA[Reply to null-terminierte Konfusion on Sun, 29 Jul 2007 20:57:53 GMT]]></title><description><![CDATA[<p>JimmydaMage schrieb:</p>
<blockquote>
<p>Das beschriebene Verhalten klingt danach, dass in der Datei vor der String noch ein Nullbyte steht...</p>
</blockquote>
<p>Ja, das würde auch erklären warum die &quot;sprintf-Kopierschleife&quot; funktioniert... die &quot;schluckt&quot; sämtliche Nullbytes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1334632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1334632</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 29 Jul 2007 20:57:53 GMT</pubDate></item></channel></rss>