<?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[fstream]]></title><description><![CDATA[<p>Warum sind die fstream Konstruktor-Parameter const char*'s und keine const std::string&amp;'s?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289067/fstream</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 10:29:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289067.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Jun 2011 23:29:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to fstream on Mon, 27 Jun 2011 23:29:03 GMT]]></title><description><![CDATA[<p>Warum sind die fstream Konstruktor-Parameter const char*'s und keine const std::string&amp;'s?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085184</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 27 Jun 2011 23:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Mon, 27 Jun 2011 23:35:01 GMT]]></title><description><![CDATA[<p>Wieso nicht?<br />
Man muss nicht jeden Mist mit std::strings lösen, vor allem wenn diese ganz einfach in const char* konvertiert werden können.</p>
<p>std::string zwingt einen zum kopieren, rohe Strings bieten da performantere Optionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085187</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 27 Jun 2011 23:35:01 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Mon, 27 Jun 2011 23:36:21 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Warum sind die fstream Konstruktor-Parameter const char*'s und keine const std::string&amp;'s?</p>
</blockquote>
<p>Tradition. Weil es auch nicht soo weh tut, ein .c_str() dranzuhängen.<br />
Vielleicht wird es ja mal geändert und string zusätzlich angeboten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085188</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 27 Jun 2011 23:36:21 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Mon, 27 Jun 2011 23:42:13 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>std::string zwingt einen zum kopieren, rohe Strings bieten da performantere Optionen.</p>
</blockquote>
<p>Deswegen schrieb ich ja std::string&amp;. Wie das weniger performant sein soll, musst du mir erst mal erklären.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Tradition.</p>
</blockquote>
<p>Na toll. Ich bin zwar noch nicht lange dabei, aber dennoch will mir kein Zeitpunkt in der Entwicklung von C++ einfallen, in dem std::string&amp; nicht sinnvoller gewesen wäre. Nachliefern wäre ja zudem auch nie ein Problem gewesen.<br />
(Zumal Visual Studio das längst implementiert hat, die g++ Fehlermeldung die ich gerade lesen musste kam schon überraschend.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085189</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 27 Jun 2011 23:42:13 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Mon, 27 Jun 2011 23:48:55 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Deswegen schrieb ich ja std::string&amp;. Wie das weniger performant sein soll, musst du mir erst mal erklären.</p>
</blockquote>
<pre><code class="language-cpp">ifstream in(&quot;c:/autoexec.bat&quot;)//performant mit char*
</code></pre>
<p>Und Du willst erstmal das in einen std::string kopieren, also strlen, new, strcpy oder memcpy, delete zusätzlich für gar nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085192</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 27 Jun 2011 23:48:55 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Mon, 27 Jun 2011 23:53:37 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Na toll. Ich bin zwar noch nicht lange dabei, aber dennoch will mir kein Zeitpunkt in der Entwicklung von C++ einfallen, in dem std::string&amp; nicht sinnvoller gewesen wäre.</p>
</blockquote>
<p>Damals als die Disketten noch aus Holz waren, da haben wir sehr aus Performance geachtet.</p>
<p>Für string spricht meiner Menung nach etwas ganz anderes, also nur das .c_str() weglassen zu dürfen. Ich denke, begin/end-Paare wären generell besser als Nullterminierte Strings, auch unten im Betriebssystem. Bald kann ein BS guten Gewissens open() mit begin/end anbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085193</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 27 Jun 2011 23:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 00:33:05 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Und Du willst erstmal das in einen std::string kopieren, also strlen, new, strcpy oder memcpy, delete zusätzlich für gar nichts.</p>
</blockquote>
<p>Zumindest ein Konstrukt wie</p>
<pre><code class="language-cpp">ifstream(const std::string&amp; s, ...)
{
  ifstream(s.c_str(), ...);
}
</code></pre>
<p>wäre doch sehr hilfreich, das dürfte nun wirklich nicht auf die Performance gehen.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Für string spricht meiner Menung nach etwas ganz anderes, also nur das .c_str() weglassen zu dürfen.</p>
</blockquote>
<p>Na ich wäre schon glücklich damit. <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="😃"
    /><br />
Aber begin/end Paare? Scheint mir auch nicht das Gelbe vom Ei zu sein..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085198</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 28 Jun 2011 00:33:05 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 00:48:56 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Und Du willst erstmal das in einen std::string kopieren, also strlen, new, strcpy oder memcpy, delete zusätzlich für gar nichts.</p>
</blockquote>
<p>Zumindest ein Konstrukt wie</p>
<pre><code class="language-cpp">ifstream(const std::string&amp; s, ...)
{
  ifstream(s.c_str(), ...);
}
</code></pre>
<p>wäre doch sehr hilfreich, das dürfte nun wirklich nicht auf die Performance gehen.</p>
</blockquote>
<p>Ja, geht meinetwegen in Ordnung. Aber es ist nur, damit Du statt</p>
<pre><code class="language-cpp">ifstream in((name+&quot;.&quot;+ext).c_str());
</code></pre>
<p>jetzt</p>
<pre><code class="language-cpp">ifstream in(name+&quot;.&quot;+ext);
</code></pre>
<p>schreiben darfst, oder?</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Aber begin/end Paare? Scheint mir auch nicht das Gelbe vom Ei zu sein..</p>
</blockquote>
<p>Och, man könnte std::string performant übergeben. Und man bräuchte nicht so oft strlen aufzurufen. Und vor allem kann man als Anwender &quot;strings&quot; auf Fremdspeicher vom Tokenizer liefern lassen und so Sachen. fnsplit kann echte &quot;strings&quot;, begin/end-Paare liefern, ohne daß auf den Fremdspeicher geschrieben werden muß und ohne daß Daten kopiert werden müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085202</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 28 Jun 2011 00:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 09:14:38 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Vielleicht wird es ja mal geändert und string zusätzlich angeboten.</p>
</blockquote>
<p>Das ist bei C++11 tatsächlich so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085294</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 28 Jun 2011 09:14:38 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 09:59:33 GMT]]></title><description><![CDATA[<p>Man hätte den CTor (und <code>open</code> ) einfach überladen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085318</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Tue, 28 Jun 2011 09:59:33 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 10:06:46 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Deswegen schrieb ich ja std::string&amp;. Wie das weniger performant sein soll, musst du mir erst mal erklären.</p>
</blockquote>
<p>Naja, wenn der Compiler die Referenz über nen Zeiger implementiert hast du bei der Variante mit const std::string&amp; ne doppelte Indirektion :p</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Ich bin zwar noch nicht lange dabei, aber dennoch will mir kein Zeitpunkt in der Entwicklung von C++ einfallen, in dem std::string&amp; nicht sinnvoller gewesen wäre.</p>
</blockquote>
<p>Och, std::string ist toll, aber auch kein Allheilmittel...</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Ich denke, begin/end-Paare wären generell besser als Nullterminierte Strings, auch unten im Betriebssystem. Bald kann ein BS guten Gewissens open() mit begin/end anbieten.</p>
</blockquote>
<p>Stimmt, Ranges sind einfach was elegantes <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/2085321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085321</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 28 Jun 2011 10:06:46 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 10:17:36 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Naja, wenn der Compiler die Referenz über nen Zeiger implementiert hast du bei der Variante mit const std::string&amp; ne doppelte Indirektion :p</p>
</blockquote>
<p>Das glaube ich weniger <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="😃"
    /><br />
Ich weiß nicht, ob ich dich richtig verstanden habe, aber so:</p>
<pre><code class="language-cpp">class MyInt
{
public:
  MyInt()
  {
    m_int = new int;
    *m_int = 5;
  }
  ~MyInt()
  {
    delete m_int;
  }
  const int* pointer()
  {
    return m_int;
  }
private:
  int *m_int;
};

class MyStream
{
public:
  MyStream(const int* p)
  {
    std::cout &lt;&lt; *p &lt;&lt; std::endl;
  }
  MyStream(MyInt&amp; p)
  {
    MyStream(p.pointer());
  }
};
</code></pre>
<p>Ist da nichts doppelt. <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>dot schrieb:</p>
<blockquote>
<p>Och, std::string ist toll, aber auch kein Allheilmittel...</p>
</blockquote>
<p>Ne, aber wenn es das schon gibt, sollten die Standardfunktionen den Typ doch zumindest entgegennehmen, wenn er sich geradezu aufdrängt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085329</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 28 Jun 2011 10:17:36 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 10:20:47 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Ist da nichts doppelt. <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>
</blockquote>
<p>Doch, bei der ersten Variante greifst du direkt über den pointer zu, bei der zweiten musst du zuerst auf p zugreifen und den pointer zu bekommen um dann über den pointer zuzugreifen <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/2085330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085330</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 28 Jun 2011 10:20:47 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 10:22:50 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Ist da nichts doppelt. <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>
</blockquote>
<p>Doch, bei der ersten Variante greifst du direkt über den pointer zu, bei der zweiten musst du zuerst auf p zugreifen und den pointer zu bekommen um dann über den pointer zuzugreifen <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>Aber nur ein mal (nicht dauerhaft, danach gibt's ja einen eigenständigen Zeiger, doppelte Indirektion heißt für mich int**.) Zudem wird das bestimmt wegoptimiert. <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/2085332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085332</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 28 Jun 2011 10:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 10:49:20 GMT]]></title><description><![CDATA[<p>Ich denke, das hat man damals einfach vergessen, genauso wie man copy_if vergessen hat. Und mit C++11 wird es ja auch endlich gefixt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085338</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Tue, 28 Jun 2011 10:49:20 GMT</pubDate></item><item><title><![CDATA[Reply to fstream on Tue, 28 Jun 2011 10:55:02 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Aber nur ein mal (nicht dauerhaft, danach gibt's ja einen eigenständigen Zeiger, doppelte Indirektion heißt für mich int**.)</p>
</blockquote>
<p>Was heißt danach gibts einen Zeiger, ich seh da nur einen Zugriff über den Zeiger!?</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Zudem wird das bestimmt wegoptimiert. <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>In dem trivialen Beispiel evtl., aber so sicher ist das im Allgemeinen nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2085339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2085339</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 28 Jun 2011 10:55:02 GMT</pubDate></item></channel></rss>