<?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[read until]]></title><description><![CDATA[<p>Ich suche eine Funktion mit der ich einen Stringstream so lange auslesen kann, bis er ein bestimmtes Wort findet.</p>
<p>Leider funktioniert das mit std::getline nicht weil er nur ein char erwartet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322889/read-until</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 13:41:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322889.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Jan 2014 19:43:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to read until on Fri, 10 Jan 2014 19:43:12 GMT]]></title><description><![CDATA[<p>Ich suche eine Funktion mit der ich einen Stringstream so lange auslesen kann, bis er ein bestimmtes Wort findet.</p>
<p>Leider funktioniert das mit std::getline nicht weil er nur ein char erwartet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376539</guid><dc:creator><![CDATA[exploit126]]></dc:creator><pubDate>Fri, 10 Jan 2014 19:43:12 GMT</pubDate></item><item><title><![CDATA[Reply to read until on Fri, 10 Jan 2014 20:03:10 GMT]]></title><description><![CDATA[<p>Folgender Ansatz:</p>
<pre><code>std::istream&amp; read_until(std::istream &amp;is, std::string &amp;value, const std::string &amp;delimiter)
{
	value.clear();
	while (true)
	{
		// alles bis zum ersten Zeichen von delimiter einlesen
		std::string tmp;
		if (!std::getline(is, tmp, delimiter[0]))
			return is;
		// das Eingelesene anfügen
		value += tmp;

		// prüfen, ob nachfolgende Zeichen passen
		auto is_delim = true;
		std::string delim_so_far;
		for (auto i = 1u; i &lt; delimiter.size(); ++i)
			if (is.peek() == delimiter[i])
				delim_so_far.push_back(is.get()); // für den Fehlerfall speichern
			else
			{
				is_delim = false;
				break;
			}
		if (is_delim)
			break;
		else
			value += delim_so_far; // die Zeichen vom Pseudodelimiter anfügen
	}

	return is;
}
</code></pre>
<p>Geht ggf. auch effizienter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376549</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 10 Jan 2014 20:03:10 GMT</pubDate></item><item><title><![CDATA[Reply to read until on Fri, 10 Jan 2014 20:04:12 GMT]]></title><description><![CDATA[<p>Definiere &quot;so lange auslesen bis er ein bestimmtes Wort findet&quot;.<br />
Vielleicht mit Hilfe eines Beispiels.</p>
<p>Da gibt's nämlich mehrere Möglichkeiten wie man das verstehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376550</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 10 Jan 2014 20:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to read until on Fri, 10 Jan 2014 20:11:34 GMT]]></title><description><![CDATA[<p>Eine eigene Funktion kann ich selbst schreiben, aber ich dachte das es für so etwas zumindest in boost eine Lösung gibt.</p>
<p>Es geht darum eine HTML Datei in verschiedene Bereiche einzteilen. Der Header endet mit &quot;/n/r/n/r&quot; und bis dahin will ich lesen.</p>
<pre><code>while( std::getline( ss, str ) )
{
    if( str.find(&quot;\n\r\n\r&quot;) )
}
</code></pre>
<p>Das würde mir schon reichen aber ich wollte keine eigene Funktion schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376553</guid><dc:creator><![CDATA[exploit126]]></dc:creator><pubDate>Fri, 10 Jan 2014 20:11:34 GMT</pubDate></item><item><title><![CDATA[Reply to read until on Fri, 10 Jan 2014 20:32:44 GMT]]></title><description><![CDATA[<p>Wenn ich mich richtig erinnere endet ne HTTP Header (falls du die meinst - ne HTML Datei hat nämlich keine Header) mit <code>\r\n\r\n</code> . Also genau umgekehrt.</p>
<p>Und ich kenne leider auch keine fertige Funktion mit der man das machen kann.<br />
Wieso liest du nicht die ganze Datei in einen <code>std::string</code> und suchst dann mit <code>string::find</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376557</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 10 Jan 2014 20:32:44 GMT</pubDate></item><item><title><![CDATA[Reply to read until on Fri, 10 Jan 2014 20:45:38 GMT]]></title><description><![CDATA[<p>Danke daran habe ich nicht gedacht <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>
<pre><code>auto pos = data.find(&quot;\r\n\r\n&quot;);
if( pos == std::string::npos )
    throw std::runtime_error(&quot;HttpFile: header not found&quot;);

head = data.substr(0, pos);
body = data.substr(pos, data.length()));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2376560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376560</guid><dc:creator><![CDATA[exploit126]]></dc:creator><pubDate>Fri, 10 Jan 2014 20:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to read until on Sat, 11 Jan 2014 05:53:15 GMT]]></title><description><![CDATA[<p>exploit126 schrieb:</p>
<blockquote>
<p>Das würde mir schon reichen aber ich wollte keine eigene Funktion schreiben.</p>
</blockquote>
<p>Wieso nicht? Einmal erledigt, hast du dein read_until() für den Rest deiner C++-Karriere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376606</guid><dc:creator><![CDATA[qwas]]></dc:creator><pubDate>Sat, 11 Jan 2014 05:53:15 GMT</pubDate></item><item><title><![CDATA[Reply to read until on Sat, 11 Jan 2014 11:49:01 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Wieso liest du nicht die ganze Datei in einen <code>std::string</code> und suchst dann mit <code>string::find</code> ?</p>
</blockquote>
<p>weil das gar nicht notwendig ist.</p>
<p>Vorschlag:</p>
<pre><code>#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt; // istream_iterator
#include &lt;algorithm&gt; // std::find

struct read_until
{
    explicit read_until( const std::string&amp; key )
        : key_( key )
    {}
    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, read_until ru )
    {
        std::find( std::istream_iterator&lt; std::string &gt;( in ), std::istream_iterator&lt; std::string &gt;(), ru.key_ );
        return in;
    }
private:
    std::string key_;
};

// -- Demonstration zur Anwendung von 'read_until'
int main()
{
    using namespace std;
    cout &lt;&lt; &quot;geben sie einen Satz mit 'hier' ein und dahinter einen  Zahl\n&quot;;
    for( int zahl; cout &lt;&lt; &quot;&gt; &quot;, cin &gt;&gt; read_until(&quot;hier&quot;) &gt;&gt; zahl; cin.ignore( 999, '\n' ) )
        cout &lt;&lt; &quot;Die Zahl ist: &quot; &lt;&lt; zahl &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Der Dialog wäre dann z.B.:</p>
<pre><code>geben sie einen Satz mit 'hier' ein und dahinter einen  Zahl
&gt; Die Zahl ist hier 42 oder?
Die Zahl ist: 42
&gt; nochmal hier 123
Die Zahl ist: 123
&gt;
</code></pre>
<p>zu erwähnen ist noch, dass 'hier' bzw. das Schlüsselwort auch als Wort gelesen werden können muss; d.h. hinter dem Schlüsselwort muss ein White Space Character (z.B.. Leerzeichen) stehen. Ein &quot;hier100 ist die Zahl&quot; oder &quot;hier=100&quot; würde nicht erkannt werden.</p>
<p>Es gab schon mal einen sehr ausführlichen Thread zu dem Thema - finde ich aber eben nicht wieder ...</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376635</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 11 Jan 2014 11:49:01 GMT</pubDate></item><item><title><![CDATA[Reply to read until on Sat, 11 Jan 2014 23:59:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a></p>
<p>exploit126 schrieb:</p>
<blockquote>
<p>Eine eigene Funktion kann ich selbst schreiben, aber ich dachte das es für so etwas zumindest in boost eine Lösung gibt.</p>
<p>Es geht darum eine HTML Datei in verschiedene Bereiche einzteilen. Der Header endet mit &quot;/n/r/n/r&quot; und bis dahin will ich lesen.</p>
</blockquote>
<p>Und mit &quot;HTML Datei&quot; meint er höchstwahrscheinlich ne HTTP Response welche als Body ne HTML Seite mitschickt.<br />
Und anhand der Formulierung vermute ich dass er beide Teile, also auch den Teil vor dem &quot;Wort&quot; haben will.</p>
<p>Klar kann das schief gehen wenn man furchtbar grosse Responses bekommt (die nicht in den Speicher passen). Oder wenn man es so massiv parallel macht dass die vielen kleineren Responses zusammen dann nicht in den Speicher passen.</p>
<p>Meine Glaskugel sagt mir aber dass das für den OP kein Problem sein wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376801</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 11 Jan 2014 23:59:34 GMT</pubDate></item></channel></rss>