<?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[Boost.PropertyTree Problem mit std::ends]]></title><description><![CDATA[<p>Hi</p>
<p>Arbeite grad mit Boost.PropertyTree und da ist mir folgendes aufgefallen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/property_tree/ptree.hpp&gt;
#include &lt;boost/property_tree/xml_parser.hpp&gt;

int main()
{
	std::stringstream ss;

	ss &lt;&lt; &quot;example&quot;;

	boost::property_tree::ptree pTree;

	read_xml( &quot;example.xml&quot;, pTree );

	try
	{
		std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str().c_str() ); //fine
		std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str() ); //fine

		ss &lt;&lt; std::ends;

		std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str().c_str() ); //fine
		std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str() ); //crash!

	}catch( std::exception &amp;e )
	{
		std::cout &lt;&lt; e.what();
	}

	return 0;
}
</code></pre>
<p>erzeugt mit folgender XML-Datei:</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;example&gt;text&lt;/example&gt;
</code></pre>
<p>folgende Ausgabe:</p>
<pre><code>texttexttextNo such node(example)
</code></pre>
<p>Folgenden Exception wird geworfen:</p>
<pre><code>boost::exception_detail::clone_impl&lt;boost::exception_detail::error_info_injector&lt;boost::property_tree::ptree_bad_path&gt; &gt; at memory location 0x0014f064..
</code></pre>
<p>Getestet unter Visual Studio 2008 &amp; 2010 mit Boost 1.42.<br />
Hab versucht dem Problem auf den Grund zu gehen aber das sind ein halbes dutzend Dateien die man da debuggen muss.</p>
<p>Koennt ihr den Fehler reproduzieren?<br />
Dass std::ends der Auslöser ist dürfte wohl klar sein, die Frage ist ob std::ends einfach böse ist oder ob Boost.PropertyTree einen Fehler hat.<br />
Bitte um eure Kommentare</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266131/boost-propertytree-problem-mit-std-ends</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 15:44:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266131.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 May 2010 12:46:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost.PropertyTree Problem mit std::ends on Tue, 04 May 2010 12:47:31 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Arbeite grad mit Boost.PropertyTree und da ist mir folgendes aufgefallen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/property_tree/ptree.hpp&gt;
#include &lt;boost/property_tree/xml_parser.hpp&gt;

int main()
{
	std::stringstream ss;

	ss &lt;&lt; &quot;example&quot;;

	boost::property_tree::ptree pTree;

	read_xml( &quot;example.xml&quot;, pTree );

	try
	{
		std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str().c_str() ); //fine
		std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str() ); //fine

		ss &lt;&lt; std::ends;

		std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str().c_str() ); //fine
		std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str() ); //crash!

	}catch( std::exception &amp;e )
	{
		std::cout &lt;&lt; e.what();
	}

	return 0;
}
</code></pre>
<p>erzeugt mit folgender XML-Datei:</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;example&gt;text&lt;/example&gt;
</code></pre>
<p>folgende Ausgabe:</p>
<pre><code>texttexttextNo such node(example)
</code></pre>
<p>Folgenden Exception wird geworfen:</p>
<pre><code>boost::exception_detail::clone_impl&lt;boost::exception_detail::error_info_injector&lt;boost::property_tree::ptree_bad_path&gt; &gt; at memory location 0x0014f064..
</code></pre>
<p>Getestet unter Visual Studio 2008 &amp; 2010 mit Boost 1.42.<br />
Hab versucht dem Problem auf den Grund zu gehen aber das sind ein halbes dutzend Dateien die man da debuggen muss.</p>
<p>Koennt ihr den Fehler reproduzieren?<br />
Dass std::ends der Auslöser ist dürfte wohl klar sein, die Frage ist ob std::ends einfach böse ist oder ob Boost.PropertyTree einen Fehler hat.<br />
Bitte um eure Kommentare</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1892227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1892227</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Tue, 04 May 2010 12:47:31 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.PropertyTree Problem mit std::ends on Tue, 04 May 2010 12:59:30 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/iostream/manipulators/ends/" rel="nofollow">http://www.cplusplus.com/reference/iostream/manipulators/ends/</a><br />
Willst du das denn wirklich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1892236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1892236</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 04 May 2010 12:59:30 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.PropertyTree Problem mit std::ends on Tue, 04 May 2010 13:09:55 GMT]]></title><description><![CDATA[<p>Der Sachverhalt ist relaitv simpel. Ich habs jetzt nicht genau nachgeschaut, vermute aber einfach mal, dass ptree::path_type std::string ist.</p>
<p>der std::string, der hinter dem stringstream steht, heißt &quot;example&quot; und hat die Länge 7. Zu deinen 4 Aufrufen:</p>
<pre><code class="language-cpp">try
    {
        std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str().c_str() ); // 1
        std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str() ); // 2

        ss &lt;&lt; std::ends;

        std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str().c_str() ); // 3
        std::cout &lt;&lt; pTree.get&lt; std::string &gt;( ss.str() ); // 4
    }
</code></pre>
<p>get() mit einem Parameter erwartet einen path_type, also einen std::string. Im Aufruf 1 lieferst du einen const char*, die Sequenz ist {'e','x','a','m','p','l','e','\0'}, wobei das '\0' von c_str() angehängt wurde. Daraus wird ein std::string gebaut, der wiederum &quot;example&quot; als Inhalt und die Länge 7 hat.<br />
In Aufruf 2 wird der ursprüngliche std::string genommen, hat also auch die Länge 7.</p>
<p>danach packst du ein ends, also ein '\0' in den Stream. Der zugrundeliegende std::string hat die Länge 8(!) und den Inhalt &quot;example\0&quot;.</p>
<p>Aufruf 3: es wird ein const char* übergeben, die Sequenz ist {'e','x','a','m','p','l','e','\0','\0'}. Daraus wird wiederum ein std::string gebastelt, der beim ersten '\0' aufhört und deshalb die Länge 7 und Inhalt &quot;example&quot; hat, also kein Problem.<br />
Aufruf 4: es wird der std:.string mit Länge 8 und dem nullcharacter übergeben, beim Parsen fliegt das Framework völlig zu Recht auf die Nase - Nullcharacter sind in XML-Pfaden nunmal nicht vorgesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1892242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1892242</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 04 May 2010 13:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.PropertyTree Problem mit std::ends on Tue, 04 May 2010 13:17:00 GMT]]></title><description><![CDATA[<p>Danke für die Aufklärung. Die Idee mit std::ends ist nicht auf meinem Mist gewachsen. Das wird in dem Code den ich gerade bearbeite wie folgt genutzt:</p>
<pre><code class="language-cpp">//--------------------------------------------------------------------------------
// This function is used to clear a stringstream in an efficient way,
// maintaining the internal buffer as described here:
// http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream/624291#624291
//--------------------------------------------------------------------------------
inline void clearStrStream( std::wstringstream &amp;stream )
{
	stream.clear();
	stream.seekg( 0 );
	stream.seekp( 0 );
}
//--------------------------------------------------------------------------------

...

std::wstringstream wStrStream( L&quot;dummy&quot; );

for(...)
{
	//Reuse stringstream
	clearStrStream( wStrStream );

...
}
</code></pre>
<p>Das hat mein Vorgänger wohl nie getestet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1892249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1892249</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Tue, 04 May 2010 13:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.PropertyTree Problem mit std::ends on Tue, 04 May 2010 14:37:31 GMT]]></title><description><![CDATA[<p>rean schrieb:</p>
<blockquote>
<p>Danke für die Aufklärung. Die Idee mit std::ends ist nicht auf meinem Mist gewachsen. Das wird in dem Code den ich gerade bearbeite wie folgt genutzt:</p>
<pre><code class="language-cpp">...
</code></pre>
<p>Das hat mein Vorgänger wohl nie getestet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Da wird nirgendwo ends benutzt. Das ends steht nur irgendwo auf der verlinkten Seite, wo dein Kollege die &quot;clearStrStream&quot;-Funktion her hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1892310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1892310</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 04 May 2010 14:37:31 GMT</pubDate></item></channel></rss>