<?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[Schreibbefehl ersetzt zu wenig]]></title><description><![CDATA[<p>Hallo zusammen,<br />
folgendes Problem:<br />
Ich habe dieses Template geschrieben:</p>
<pre><code class="language-cpp">template &lt;class X&gt; void dateischreiber (X datensatz, int zeigerPosition) {
    fstream songstream (&quot;Song.txt&quot;,ios::out|ios::in);
    songstream.seekp (zeigerPosition, ios::beg);
        if (songstream.good()) {
        songstream &lt;&lt; datensatz;
        } else {
            cerr &lt;&lt; &quot;Bibliothek beschädigt oder nicht auffindbar! \n&quot;;
            system(&quot;PAUSE&quot;);
        }
        songstream.close();
}
</code></pre>
<p>Das ganze soll einfach nur den übergebenen Datensatz (meist ein Array of Char) in die angegebene Datei schreiben.<br />
Soweit funktioniert das auch, nur falls in der Datei schon etwas an der übergebenen Stelle vorhanden ist, wird nicht aller ersetzt.<br />
Vielleicht ein kleines Beispiel zu Verständnis:<br />
Ich übergebe im 1. Durchlauf ein Char [100] mit dem Inhalt &quot;Testtext&quot; und den Zeiger schicke ich einfach mal an die Stelle null.<br />
Im 2. Durchlauf schicke ich ebenfalls ein Char [100] mit dem Text &quot;Hallo&quot; rein (Zeiger wie eben).<br />
In einer später abgefragten Ausgabe kommt nun für die ersten 100 Stellen der Datei &quot;Halloext&quot; raus.</p>
<p>Wie bekomme ich es hin, dass tatsächlich die vollen 100 Stellen überschrieben werden und nicht nur die tatsächlich gefüllten ?</p>
<p>Gruß Jörg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/299651/schreibbefehl-ersetzt-zu-wenig</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 03:19:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299651.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Feb 2012 16:41:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schreibbefehl ersetzt zu wenig on Wed, 15 Feb 2012 16:41:14 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
folgendes Problem:<br />
Ich habe dieses Template geschrieben:</p>
<pre><code class="language-cpp">template &lt;class X&gt; void dateischreiber (X datensatz, int zeigerPosition) {
    fstream songstream (&quot;Song.txt&quot;,ios::out|ios::in);
    songstream.seekp (zeigerPosition, ios::beg);
        if (songstream.good()) {
        songstream &lt;&lt; datensatz;
        } else {
            cerr &lt;&lt; &quot;Bibliothek beschädigt oder nicht auffindbar! \n&quot;;
            system(&quot;PAUSE&quot;);
        }
        songstream.close();
}
</code></pre>
<p>Das ganze soll einfach nur den übergebenen Datensatz (meist ein Array of Char) in die angegebene Datei schreiben.<br />
Soweit funktioniert das auch, nur falls in der Datei schon etwas an der übergebenen Stelle vorhanden ist, wird nicht aller ersetzt.<br />
Vielleicht ein kleines Beispiel zu Verständnis:<br />
Ich übergebe im 1. Durchlauf ein Char [100] mit dem Inhalt &quot;Testtext&quot; und den Zeiger schicke ich einfach mal an die Stelle null.<br />
Im 2. Durchlauf schicke ich ebenfalls ein Char [100] mit dem Text &quot;Hallo&quot; rein (Zeiger wie eben).<br />
In einer später abgefragten Ausgabe kommt nun für die ersten 100 Stellen der Datei &quot;Halloext&quot; raus.</p>
<p>Wie bekomme ich es hin, dass tatsächlich die vollen 100 Stellen überschrieben werden und nicht nur die tatsächlich gefüllten ?</p>
<p>Gruß Jörg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181562</guid><dc:creator><![CDATA[JörgK]]></dc:creator><pubDate>Wed, 15 Feb 2012 16:41:14 GMT</pubDate></item><item><title><![CDATA[Reply to Schreibbefehl ersetzt zu wenig on Wed, 15 Feb 2012 17:53:13 GMT]]></title><description><![CDATA[<p>bei &quot;songstream &lt;&lt; datensatz&quot; wird dein char[100] in einen char* auf das erste Element aufgelöst.<br />
Der Stream interpretiert den Zeiger als Beginn einer Null-terminierten Zeichenkette und schreibt daher nur den Text bis (ausschließlich) zum Null-Byte.</p>
<p>Was du möchtest erreichst du nicht mit den Streaming-Operatoren (&lt;&lt;).<br />
Dafür benötigst du die write-Methode (<a href="http://www.cplusplus.com/reference/iostream/ostream/write/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ostream/write/</a>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181591</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Wed, 15 Feb 2012 17:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to Schreibbefehl ersetzt zu wenig on Wed, 15 Feb 2012 18:06:07 GMT]]></title><description><![CDATA[<p>Naja, alternativ kannst Du Dein Array ja vorher mit der entsprechenden Anzahl von Leerzeichen auffüllen, so dass es immer 99 Zeichen und ein 0-Byte hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181598</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 15 Feb 2012 18:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to Schreibbefehl ersetzt zu wenig on Wed, 15 Feb 2012 18:08:35 GMT]]></title><description><![CDATA[<p>Vielen Dank ! Das war's !</p>
<p>Aber vielleicht noch die Frage:<br />
Warum macht es keinen Unterschied, wenn ich dem übergebenen Datensatz im Konstruktor seiner Classe lauter Leerzeichen zuweise ? Dann müsste doch eigentlich erst an Stelle 100 die 0 sein, oder?</p>
<p>Gruß Jörg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2181600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2181600</guid><dc:creator><![CDATA[JörgK]]></dc:creator><pubDate>Wed, 15 Feb 2012 18:08:35 GMT</pubDate></item><item><title><![CDATA[Reply to Schreibbefehl ersetzt zu wenig on Fri, 17 Feb 2012 12:27:33 GMT]]></title><description><![CDATA[<p>Ja so ist es ja auch.<br />
Ein Leerzeichen ist wenn du so willst nichts anderes wie ein Buchstabe oder eine Zahl. Die ganzen string funktionen wie strlen, strcmp, strcpy gehen immer von Null-terminierten chars aus. Philosphie anderer Programmiersprachen früher war, dass am Anfang die Größe des Strings stand und darauf die Zeichen kamen.</p>
<p>Es hat sich halt so eingebürgert, dass man entweder die Länge eh schon weiß oder <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="😃"
    /> es eben nicht auf die Länge drauf ankommt. Also ein strcpy liest immer ein Zeichen, kopiert es. Wenn es 0 war fertig, ansonsten nächstes Zeichen lesen. Uninteressant wie lang der string ist.</p>
<p>Bei Dateien kannst du alle Zeichen abspeichern, auch 0 Bytes. Denn das Filesystem arbeitet mit Längen. Wenn du aber aus C++ ein write aufrufst mit Angabe des chars, muss dieser Null-terminiert sein, oder du gibst die gewünschte Länge mit an und es wird in die Datei die gesamte Länge geschrieben.</p>
<p>Überleg mal was die Ausgaben hier wohl sein werden:</p>
<pre><code class="language-cpp">cout &lt;&lt; sizeof(&quot;Hallo&quot;)&lt;&lt;endl;
cout &lt;&lt; strlen(&quot;Hallo&quot;)&lt;&lt;endl;
</code></pre>
<p>Hier eine Lösung:</p>
<pre><code class="language-cpp">template &lt;class X&gt; void dateischreiber (X datensatz, size_t size, int zeigerPosition) {
    fstream songstream (&quot;Song.txt&quot;,ios::out|ios::in);
    songstream.seekp (zeigerPosition, ios::beg);
        if (songstream.good()) {
        songstream.write(&amp;datensatz, size);
        } else {
            cerr &lt;&lt; &quot;Bibliothek beschädigt oder nicht auffindbar! \n&quot;;
            system(&quot;PAUSE&quot;);
        }
        songstream.close();
}

char hallo[100] = &quot;Hallo&quot;; // Hallo\0\0\0\0\0\0...
char x[100] = &quot;x&quot;; // x\0\0\0\0\0\0...

dateischreiber(hallo, sizeof(hallo), 0); // schreibt 100 Zeichen
dateischreiber(x, sizeof(hallo), 0); // schreibt auch 100 Zeichen
// File: x\0\0\0\0\0\0\0...

dateischreiber(hallo, sizeof(hallo), 0); // schreibt 100 Zeichen
dateischreiber(x, strlen(hallo), 0); // schreibt 1 Zeichen
// File: xallo\0\0\0\0\0\0...
</code></pre>
<p>Der &lt;&lt; Operator wurde ungefähr so überschrieben:</p>
<pre><code class="language-cpp">ostream &amp;operator&lt;&lt;(ostream &amp;stream, const char *string)
{
   stream.write(string, strlen(string));
   return stream;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2182285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182285</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Fri, 17 Feb 2012 12:27:33 GMT</pubDate></item></channel></rss>