<?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 Spirit, phrase_parse() mit std::vector&amp;lt;std::string&amp;gt;::const_iterator]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen Parser mit Boost Spirit geschrieben der Teile einer Datei parst (nicht die ganze Datei da das Dateiformat zu umfangreich ist).<br />
Ich lese nur Teile der Datei ein die ich parsen moechte, das mache ich so in etwa :</p>
<pre><code>std::string = &quot;&quot;;
while(file.good())
{
    std::getline(file,line);
    if(line.find(&quot;...&quot;))str+=line;
}
</code></pre>
<p>Das ganze ist natuerlich total imperformant da ich immer wieder an str anhaenge. Jetzt moechte ich die Teile der Datei nicht in in einem std::string speichern sondern in einem std::vector :</p>
<pre><code>std::vector&lt;std::string&gt;vec;
while(file.good())
{
    std::getline(file,line);
    if(line.find(&quot;...&quot;))vec.push_back(line);
}
</code></pre>
<p>Wie kann ich jetzt den vector Boost spirit parse_phrase zum parsen uebergeben? In der Doku steht das Boost Spirit phrase_parse einen ForwardIterator erwartet, ich versuche phrase_parse wie folgt auzurufen:</p>
<pre><code>std::vector&lt;std::string&gt;vec;
while(file.good())
{
    std::getline(file,line);
    if(line.find(&quot;...&quot;))vec.push_back(line);
}

boost::spirit::qi::phrase_parse(vec.cbegin(),vec.cend(),parser,skip,st))
</code></pre>
<p>Jetzt bekomme ich aber die Compilerfehlermeldung:</p>
<pre><code>0: '&lt;function-style-cast&gt;' : cannot convert from 'std::basic_string&lt;_Elem,_Traits,_Ax&gt;' to 'char'
</code></pre>
<p>Was mache ich falsch?</p>
<p>Besten Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/318360/boost-spirit-phrase_parse-mit-std-vector-lt-std-string-gt-const_iterator</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 10:51:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318360.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Jul 2013 04:31:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost Spirit, phrase_parse() mit std::vector&amp;lt;std::string&amp;gt;::const_iterator on Wed, 10 Jul 2013 04:31:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen Parser mit Boost Spirit geschrieben der Teile einer Datei parst (nicht die ganze Datei da das Dateiformat zu umfangreich ist).<br />
Ich lese nur Teile der Datei ein die ich parsen moechte, das mache ich so in etwa :</p>
<pre><code>std::string = &quot;&quot;;
while(file.good())
{
    std::getline(file,line);
    if(line.find(&quot;...&quot;))str+=line;
}
</code></pre>
<p>Das ganze ist natuerlich total imperformant da ich immer wieder an str anhaenge. Jetzt moechte ich die Teile der Datei nicht in in einem std::string speichern sondern in einem std::vector :</p>
<pre><code>std::vector&lt;std::string&gt;vec;
while(file.good())
{
    std::getline(file,line);
    if(line.find(&quot;...&quot;))vec.push_back(line);
}
</code></pre>
<p>Wie kann ich jetzt den vector Boost spirit parse_phrase zum parsen uebergeben? In der Doku steht das Boost Spirit phrase_parse einen ForwardIterator erwartet, ich versuche phrase_parse wie folgt auzurufen:</p>
<pre><code>std::vector&lt;std::string&gt;vec;
while(file.good())
{
    std::getline(file,line);
    if(line.find(&quot;...&quot;))vec.push_back(line);
}

boost::spirit::qi::phrase_parse(vec.cbegin(),vec.cend(),parser,skip,st))
</code></pre>
<p>Jetzt bekomme ich aber die Compilerfehlermeldung:</p>
<pre><code>0: '&lt;function-style-cast&gt;' : cannot convert from 'std::basic_string&lt;_Elem,_Traits,_Ax&gt;' to 'char'
</code></pre>
<p>Was mache ich falsch?</p>
<p>Besten Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2337817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2337817</guid><dc:creator><![CDATA[PanAm]]></dc:creator><pubDate>Wed, 10 Jul 2013 04:31:17 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit, phrase_parse() mit std::vector&amp;lt;std::string&amp;gt;::const_iterator on Wed, 10 Jul 2013 05:28:33 GMT]]></title><description><![CDATA[<p>Als erstes:</p>
<pre><code>while(file.good())
</code></pre>
<p>Das ist eine ganz blöde und unidiomatische Schleifenbedingung.<br />
Besser:</p>
<pre><code>std::string line; // War wohl so gemeint, die Definition
while( std::getline(file,line) )
    if( line.find(&quot;...&quot;) )
        str += line;
</code></pre>
<p>Zu deinem eigentlichen Problem: Ich rate, dass <code>parse_phrase</code> Iteratoren auf <strong>Zeichen</strong> (vom Typ <code>char</code> ) erwartet, nicht auf <strong>Strings</strong>.</p>
<blockquote>
<p>Das ganze ist natuerlich total imperformant da ich immer wieder an str anhaenge.</p>
</blockquote>
<p>Nö, das ganze ist nicht unperformant. Nicht wenn du vorher Speicher reservierst, dann ist das nur eine Kopie.</p>
<pre><code>str.reserve( /* Eine Zahl die in etwa abschätzt wie viel Zeichen du lesen wirst */ );
</code></pre>
<p>Und danach kannst du dann<a href="http://en.cppreference.com/w/cpp/string/basic_string/shrink_to_fit" rel="nofollow"> <code>shrink_to_fit</code> </a>aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2337818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2337818</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 10 Jul 2013 05:28:33 GMT</pubDate></item><item><title><![CDATA[Reply to Boost Spirit, phrase_parse() mit std::vector&amp;lt;std::string&amp;gt;::const_iterator on Wed, 10 Jul 2013 05:47:06 GMT]]></title><description><![CDATA[<p>Wie soll ich das vorher abschaetzen koennen? Manchmal ist die Datei nur einige Kilobyte gross und ein anderes mal ueber 30 Megabyte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2337821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2337821</guid><dc:creator><![CDATA[PanAm]]></dc:creator><pubDate>Wed, 10 Jul 2013 05:47:06 GMT</pubDate></item></channel></rss>