<?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[string ist bei Ausgabe mit printf (null)]]></title><description><![CDATA[<p>Hallo!</p>
<p>ich vermute mal äußerst simple Frage, aber warum ergibt folgender Code</p>
<pre><code class="language-cpp">string hallo = &quot;ichbineinstring&quot;;
printf(&quot;%s&quot;,hallo);
printf(&quot;\n&quot;);
cout &lt;&lt; hallo &lt;&lt; endl;
</code></pre>
<p>bei Nutzung von printf (null)?</p>
<pre><code>(null)
ichbineinstring
</code></pre>
<p>?<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243656/string-ist-bei-ausgabe-mit-printf-null</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 18:30:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243656.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Jun 2009 13:49:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 13:49:25 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>ich vermute mal äußerst simple Frage, aber warum ergibt folgender Code</p>
<pre><code class="language-cpp">string hallo = &quot;ichbineinstring&quot;;
printf(&quot;%s&quot;,hallo);
printf(&quot;\n&quot;);
cout &lt;&lt; hallo &lt;&lt; endl;
</code></pre>
<p>bei Nutzung von printf (null)?</p>
<pre><code>(null)
ichbineinstring
</code></pre>
<p>?<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729486</guid><dc:creator><![CDATA[PeterFragt]]></dc:creator><pubDate>Fri, 19 Jun 2009 13:49:25 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 13:51:14 GMT]]></title><description><![CDATA[<p>Versuch mal die Methode c_str von std::string...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729488</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 19 Jun 2009 13:51:14 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 13:55:17 GMT]]></title><description><![CDATA[<p>Weil es undefiniertes Verhalten ist.<br />
<code>printf</code> ist eine C Funktion und ist nur für fundamentale Typen gedacht. <code>std::string</code> dagegen ist eine Klasse, bzw. ein komplexer Typ.</p>
<p>Es empfiehlt sich hier die C++ Funktionen für Ein- und Ausgabe zu verwenden:</p>
<pre><code class="language-cpp">std::string hallo = &quot;ichbineinstring&quot;;
std::cout &lt;&lt; hallo &lt;&lt; std::endl;
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729492</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 19 Jun 2009 13:55:17 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 13:55:34 GMT]]></title><description><![CDATA[<p>Nein, benutze in C++ <code>std::cout</code> für die Standardausgabe.</p>
<p><code>printf()</code> kommt aus C und kommt nur mit skalaren Typen zurecht. Ausserdem ist es durch die fehlende Typsicherheit recht fehleranfällig, wenn man nicht genau weiss, was man macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729493</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 19 Jun 2009 13:55:34 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 14:02:41 GMT]]></title><description><![CDATA[<p>Ah, danke!</p>
<pre><code class="language-cpp">string hallo = &quot;ichbineinstring&quot;;
char str[20] = &quot;ichbinaucheinstring&quot;;
printf(&quot;%s&quot;,str);
printf(&quot;\n&quot;);
cout &lt;&lt; hallo &lt;&lt; endl;
getchar();
</code></pre>
<p>So ist besser <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729498</guid><dc:creator><![CDATA[PeterFragt]]></dc:creator><pubDate>Fri, 19 Jun 2009 14:02:41 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 14:05:08 GMT]]></title><description><![CDATA[<p>PeterFragt schrieb:</p>
<blockquote>
<p>Ah, danke!</p>
<pre><code class="language-cpp">string hallo = &quot;ichbineinstring&quot;;
char str[20] = &quot;ichbinaucheinstring&quot;;
printf(&quot;%s&quot;,str);
printf(&quot;\n&quot;);
cout &lt;&lt; hallo &lt;&lt; endl;
getchar();
</code></pre>
<p>So ist besser <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="🙂"
    /></p>
</blockquote>
<p>nicht wirklich...</p>
<pre><code class="language-cpp">using namespace std;

const char str[] = &quot;.....&quot;;
cout &lt;&lt; str &lt;&lt; endl;
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729500</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 19 Jun 2009 14:05:08 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 14:05:17 GMT]]></title><description><![CDATA[<p>Ja. Und da es normalerweise keinen Grund gibt, sich mit <code>printf()</code> rumzuschlagen, kannst du auch für <code>char*</code> den C++-Stream <code>std::cout</code> nehmen. Dieser funktioniert nämlich genauso und erkennt im Gegensatz zu <code>printf()</code> seinen Argumenttyp, du brauchst also kein <code>&quot;%s&quot;</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729501</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 19 Jun 2009 14:05:17 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 14:07:23 GMT]]></title><description><![CDATA[<p>Verstehe, danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729505</guid><dc:creator><![CDATA[PeterFragt]]></dc:creator><pubDate>Fri, 19 Jun 2009 14:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 15:16:21 GMT]]></title><description><![CDATA[<p>Und falls du doch mal für irgendeine Funktion einen char* auf deinen std::string brauchst (soll schon mal vorkommen), dann nimm wie gesagt die Methode c_str, also &quot;hallo.c_str()&quot; (so würde es auch mit printf klappen)...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729566</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 19 Jun 2009 15:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 15:38:22 GMT]]></title><description><![CDATA[<p>ich behalts im Hinterkopf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729588</guid><dc:creator><![CDATA[PeterFragt]]></dc:creator><pubDate>Fri, 19 Jun 2009 15:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 15:43:54 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">string z = &quot;lutsch0r!&quot;;
	printf( &quot;%s&quot;, z.c_str());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1729594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729594</guid><dc:creator><![CDATA[lutsch0r!]]></dc:creator><pubDate>Fri, 19 Jun 2009 15:43:54 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 16:27:05 GMT]]></title><description><![CDATA[<p>PeterFragt schrieb:</p>
<blockquote>
<p>ich behalts im Hinterkopf</p>
</blockquote>
<p>aber behalts mit const char* und nicht char* im hinterkopf ^^<br />
braucht man aber eigtl nur für C-APIs</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729638</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 19 Jun 2009 16:27:05 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 16:36:24 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>braucht man aber eigtl nur für C-APIs</p>
</blockquote>
<p>Nö. Wie konstruierst du z.B. ein std::fstream-Objekt? <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="😉"
    /><br />
(In der Praxis benutzt man std::fstream natürlich nach Möglichkeit ohnehin nicht.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729643</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 19 Jun 2009 16:36:24 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 16:43:12 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>hab ja extra &quot;eigentlich&quot; geschrieben - ist ja nicht so, dass ich nicht daran gedacht hätte <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=";D"
      alt="😉"
    /> danke ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729648</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 19 Jun 2009 16:43:12 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 16:58:49 GMT]]></title><description><![CDATA[<p>Manchmal hat man ja auch mit C-APIs (oder C++-APIs, die trotzdem C-Strings verwenden) zu tun. Kann man sich nicht immer aussuchen, daher ist es auch gut, zu wissen was man in dem Fall mit seinen std::string's machen muss...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729659</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 19 Jun 2009 16:58:49 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 17:20:49 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Nö. Wie konstruierst du z.B. ein std::fstream-Objekt? <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="😉"
    /></p>
</blockquote>
<p>Das sollte doch im kommenden Standard angepasst werden.</p>
<p>audacia schrieb:</p>
<blockquote>
<p>(In der Praxis benutzt man std::fstream natürlich nach Möglichkeit ohnehin nicht.)</p>
</blockquote>
<p>Wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1729671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729671</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 19 Jun 2009 17:20:49 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Fri, 19 Jun 2009 21:00:39 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>audacia schrieb:</p>
<blockquote>
<p>(In der Praxis benutzt man std::fstream natürlich nach Möglichkeit ohnehin nicht.)</p>
</blockquote>
<p>Wie?</p>
</blockquote>
<p>Na du solltest natürlich fprintf/fscanf benutzen! Wusstest du das etwa nicht? <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="😉"
    /> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1729803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1729803</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 19 Jun 2009 21:00:39 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Sat, 20 Jun 2009 11:50:35 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>audacia schrieb:</p>
<blockquote>
<p>(In der Praxis benutzt man std::fstream natürlich nach Möglichkeit ohnehin nicht.)</p>
</blockquote>
<p>Wie?</p>
</blockquote>
<p>Nun, die Streams sind in allen mir bekannten Implementationen langsamer als C-Streams (teilweise um Größenordnungen), und außerdem sind sie nicht moduslos, was Fehler in der Anwendung begünstigt und den korrekten Umgang massiv erschwert. Gewöhnlich ist man mit einem kleinen RAII-Wrapper um die C-Funktionen viel besser dran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730016</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 20 Jun 2009 11:50:35 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Sat, 20 Jun 2009 12:11:03 GMT]]></title><description><![CDATA[<p>Okay, das kann gut sein, ich kenne die C-Funktionen aber auch zu wenig, um das genau beurteilen zu können.</p>
<p>Naja, ich hatte bisher eigentlich nicht viele Probleme mit <code>std::fstream</code> , für meine Anwendungen reicht es. Ich finde zum Beispiel auch die Operatoren <code>&gt;&gt;</code> und <code>&lt;&lt;</code> sehr komfortabel und habe momentan nicht wirklich Lust, alle Überladungen nachzuprogrammieren. <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730025</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 20 Jun 2009 12:11:03 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Sat, 20 Jun 2009 12:38:16 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Okay, das kann gut sein, ich kenne die C-Funktionen aber auch zu wenig, um das genau beurteilen zu können.</p>
</blockquote>
<p>Man braucht die C-Funktionen nicht zu kennen, um zu sehen, daß es sich bei fstream um einen gewaltigen Designfehler handelt. Beispiele: die Existenz von fstream::good() und fstream::close().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730042</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 20 Jun 2009 12:38:16 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Sat, 20 Jun 2009 12:45:11 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Man braucht die C-Funktionen nicht zu kennen, um zu sehen, daß es sich bei fstream um einen gewaltigen Designfehler handelt. Beispiele: die Existenz von fstream::good() und fstream::close().</p>
</blockquote>
<p>Ja, die Streams sind zum Teil etwas speziell. Allerdings habe ich die bisher nicht so kritisch betrachtet, was auch daran liegen könnte, dass ich kaum Alternativen kenne.</p>
<p>Aber weshalb erachtest du die beiden Methoden als Designfehler? Weil sie durch andere Memberfunktionen eigentlich bereits abgedeckt sind (z.B. Dtor bei <code>close()</code> )?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730046</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 20 Jun 2009 12:45:11 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Sat, 20 Jun 2009 12:51:54 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Nun, die Streams sind in allen mir bekannten Implementationen langsamer als C-Streams (teilweise um Größenordnungen), und außerdem sind sie nicht moduslos, was Fehler in der Anwendung begünstigt und den korrekten Umgang massiv erschwert.</p>
</blockquote>
<p>1. Geschwindigkeit:<br />
<a href="http://www.cplusplus.com/reference/iostream/streambuf/pubsetbuf/" rel="nofollow">http://www.cplusplus.com/reference/iostream/streambuf/pubsetbuf/</a><br />
Viele Implementationen haben standardmässig keinen Puffer gesetzt, weshalb sie als deutlich langsamer erscheinen. Der Puffer kann verdammt viel ausmachen.</p>
<p>2. Moduslos:<br />
<a href="http://www.cplusplus.com/reference/iostream/ios/exceptions/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/exceptions/</a><br />
Man kann sich über Modusänderungen sehr schnell und explizit informieren lassen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730051</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 20 Jun 2009 12:51:54 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Sat, 20 Jun 2009 13:23:14 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Aber weshalb erachtest du die beiden Methoden als Designfehler?</p>
</blockquote>
<p>fstream::good(), weil es impliziert, daß ich stets manuell auf Fehler überprüfen muß. Wozu gibt es denn Exceptions?</p>
<p>fstream::close(), weil es das Objekt in einen Modus versetzt, in dem der Aufruf mancher Methoden nicht mehr gültig ist. Zudem steckt fstream noch in einer Vererbungshierarchie, in der es auf diese Weise das LSP verletzt.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>2. Moduslos:<br />
<a href="http://www.cplusplus.com/reference/iostream/ios/exceptions/" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/exceptions/</a><br />
Man kann sich über Modusänderungen sehr schnell und explizit informieren lassen.</p>
</blockquote>
<p>Das ist nicht, was ich mit &quot;moduslos&quot; meine; siehe meine Ausführungen zu fstream::close().</p>
<p>Und daß man das Verhalten im Fehlerfalle umstellen kann, macht die Sache IMHO nur noch schlimmer, weil man dadurch ein fstream-Objekt mit noch einem Zustand behaftet, der ihn eigentlich nichts angeht. Beispiel:</p>
<pre><code class="language-cpp">void tryRead (istream&amp; stream, ...)
{
    stream.read (...);
    if (!stream.good ())
        ...; // set default value
}
void foo (void)
{
    std::fstream theFile (&quot;someFile&quot;, ...);
    theFile.exceptions (&gt;alles&lt;);
    ...
    tryRead (stream, ...); // &lt;--
}
</code></pre>
<p>Hier verursacht der Aufruf von tryRead() unerwartetes Verhalten, da tryRead() sich auf das Standardverhalten des Streams verläßt. Korrekt müßte man tryRead() also so implementieren:</p>
<pre><code class="language-cpp">class StreamExceptionStatePreserver
{
private:
    ios_base::iostate prevState;
public:
    StreamExceptionStatePreserver (ios&amp; theStream, ios_base::iostate newState)
     : prevState (theStream.exceptions ())
    { theStream.exceptions (newState); }
    ~StreamExceptionStatePreserver (void)
    { theStream.exceptions (prevState); }
};    

void tryRead (istream&amp; stream, ...)
{
    StreamExceptionStatePreserver esp (stream, &gt;garnix&lt;);
    stream.read (...);
    if (!stream.good ())
        ...; // set default value
}
</code></pre>
<p>Ich weiß nicht, wie es dir geht, aber spätestens da schreit sämtliche mir verbliebene Intuition laut &quot;Designfehler&quot;.</p>
<p>Eine Klasse, die derartige Workarounds erfordert, wird von mir i.d.R. ohnehin erst von einem adäquaten Wrapper umgeben, der die Komplexität in der Anwendung reduziert. Und wenn wir ohnehin beim Wrappen sind, können wir auch gleich die C-Funktionen wrappen, weil sie viel weniger Ballast haben und in der Praxis schlicht schneller sind, Puffer hin oder her.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730067</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 20 Jun 2009 13:23:14 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Sat, 20 Jun 2009 13:55:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>,<br />
1. Wieso verletzt <code>fstream</code> das Liskovsches Substitutionsprinzip? Leuchtet mir gerade nicht ein.<br />
2. Bei den Exceptions setze ich immer den richtigen Status für das Programm oder Bibliothek gleich beim Anfang der Arbeit. Also wenn ein Stream übergeben wird, dann hole ich mir das <code>streambuf</code> Objekt raus und übergebe es einem eigenen Streamobjekt.<br />
3. Das mit der Geschwindigkeit verstehe ich nicht. Ich habe schon selber Tests durchgeführt und zwar mit einer XML Bibliothek. Allerdings muss ich sagen, dass meine XML Files sich in Grössenordnungen von 1 - 2 MiB bewegt haben. Ich konnte keinen Unterschied messen. Was für mich bedeutet, dass es wahrscheinlich erst bei wirklich grossen Files unter Umständen zu einer Differenz kommt. Und wahrscheinlich ist die Differenz eher klein. In den meisten Fällen ist die &quot;Anklage&quot; allerdings völlig übertrieben.<br />
4. Wenn man wirklich etwas an den Streams ankreiden möchte, dann sollte man dies beim ganzen Locale und Facet Zeug machen. Dort ist meiner Meinung nach wirklich ein Designfehler passiert. Das Zeug ist viel zu komplex, es verstösst gegen Speicherzugehörigkeit (wer Speicher holt, gibt ihn frei), ist unübersichtlich und unverständlich, viel zu umfangreich für kleine Dinge, usw. usf.</p>
<p>5. Gibt es eigentlich Vorschläge für Verbesserung der Streams? Bzw. gibt es einfachere/bessere Streambibliotheken? Wäre mal interessant sich mit dem Zeug auseinander zu setzen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730078</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 20 Jun 2009 13:55:34 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Sat, 20 Jun 2009 14:27:30 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>1. Wieso verletzt <code>fstream</code> das Liskovsches Substitutionsprinzip? Leuchtet mir gerade nicht ein.</p>
</blockquote>
<p>Nun, std::fstream definiert einen Zustand, in dem der korrespondierende Stream überhaupt nicht existiert und deshalb der Aufruf aller auf dem Stream operierender Methoden fehlschlägt. Die Basisklasse std::iostream tut das nicht - für sie gibt es nur Streams in intaktem und nicht intaktem Zustand.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>2. Bei den Exceptions setze ich immer den richtigen Status für das Programm oder Bibliothek gleich beim Anfang der Arbeit. Also wenn ein Stream übergeben wird, dann hole ich mir das <code>streambuf</code> Objekt raus und übergebe es einem eigenen Streamobjekt.</p>
</blockquote>
<p>Es ist schön, daß du im eigenen Code vorsorgst, aber das hat nun aber doch nichts damit zu tun, daß das Design der Streams in diesem Punkt fragwürdig ist, zu tun, oder?</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>4. Wenn man wirklich etwas an den Streams ankreiden möchte, dann sollte man dies beim ganzen Locale und Facet Zeug machen. Dort ist meiner Meinung nach wirklich ein Designfehler passiert. Das Zeug ist viel zu komplex, es verstösst gegen Speicherzugehörigkeit (wer Speicher holt, gibt ihn frei), ist unübersichtlich und unverständlich, viel zu umfangreich für kleine Dinge, usw. usf.</p>
</blockquote>
<p>Ja, da stimme ich uneingeschränkt zu. Aber falls du damit sagen willst, daß das Design der Streamklassen ansonsten in Ordnung ist, dann wäre es an der Zeit, daß du dich mal zu meinen Argumenten äußerst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730083</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 20 Jun 2009 14:27:30 GMT</pubDate></item><item><title><![CDATA[Reply to string ist bei Ausgabe mit printf (null) on Sat, 20 Jun 2009 16:09:09 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Nun, std::fstream definiert einen Zustand, in dem der korrespondierende Stream überhaupt nicht existiert und deshalb der Aufruf aller auf dem Stream operierender Methoden fehlschlägt. Die Basisklasse std::iostream tut das nicht - für sie gibt es nur Streams in intaktem und nicht intaktem Zustand.</p>
</blockquote>
<p>Das ist aber kein Verstoss gegen das Liskovsche Substitutionsprinzip. LSP geht genau in die andere Richtung. Es müssen alle beweisbaren Eigenschaft der Basisklasse auch für die abgeleitete Klasse gelten. Das ist auch der Fall.</p>
<p><code>std::fstream</code> erweitert nur die Eigenschaften und das ist auch der Sinn von Vererbung!</p>
<p>audacia schrieb:</p>
<blockquote>
<p>Es ist schön, daß du im eigenen Code vorsorgst, aber das hat nun aber doch nichts damit zu tun, daß das Design der Streams in diesem Punkt fragwürdig ist, zu tun, oder?</p>
</blockquote>
<p>Fragwürdig ist aber nicht gleich ein Designfehler. Ich finde es gar nicht so fragwürdig, für mich ergibt das zum Teil durchaus einen Sinn. Man hat verschiedene Möglichkeiten. Und die exceptionfreie Möglichkeit hat durchaus seine Vorteile. Ich verwende oft beide Möglichkeiten.</p>
<p>Man könnte vielleicht die Frage in den Raum stellen, wieso man nicht zwei Klassen gemacht hat. Eine mit Exception und eine ohne Exception. Das hätte vielleicht eine bessere Abgrenzung zwischen beiden Versionen geschaffen. Es hätte aber womöglich auch eine Menge an Codeduplizierung geschaffen.</p>
<p>Ich habe nichts dagegen, wenn man die Sache überdenkt. Allerdings sollte man zwei Dinge im Hinterkopf behalten:<br />
1. Es können immer Fehler beim Design passieren. Das heisst aber nicht, dass die Klassen dann gleich nutzlos sind.<br />
2. Nachher ist man immer klüger <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="😉"
    /></p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Aber falls du damit sagen willst, daß das Design der Streamklassen ansonsten in Ordnung ist, dann wäre es an der Zeit, daß du dich mal zu meinen Argumenten äußerst.</p>
</blockquote>
<p>Nein, ich halte die Streamklassen ansonsten nicht einfach für in Ordnung. Aber ich halte sie auch nicht für einen völligen Designfehler und finde auch nicht, dass man sie gleich wegwerfen soll. Alles ist immer verbesserungswürdig. Ich finde die Ideen der Streamklassen gar nicht so schlecht, die Umsetzung lässt höchstens zum Teil zu wünschen übrig. Aber es ist definitiv nicht so, dass man sie nicht verwenden könnte.</p>
<p>Ich persönlich habe ein wenig das Gefühl, dass du aus einer Mücke einen Elefanten machst und dich dann darüber beschwerst, dass du den Elefanten nicht hochheben kannst <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üssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730114</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 20 Jun 2009 16:09:09 GMT</pubDate></item></channel></rss>