<?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[std::istream]]></title><description><![CDATA[<p>hi, es gibt eine funktion die daten aus einem istream liest und verarbeitet, ich habe diese daten als string vorliegen. es sind jedoch sehr viele daten, sodass ein kopieren in einen istringstream langsam ist oder sogar fehlschlägt (wenn nicht genügend speicher vorhanden ist). wie kann man einen modifizierten istream schreiben, der direkt auf dem stream operiert, oder noch allgemeiner (falls ich mal zu deque oder so umschwenken möchte) auf iteratoren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327087/std-istream</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 21:27:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327087.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Jul 2014 09:05:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 09:05:19 GMT]]></title><description><![CDATA[<p>hi, es gibt eine funktion die daten aus einem istream liest und verarbeitet, ich habe diese daten als string vorliegen. es sind jedoch sehr viele daten, sodass ein kopieren in einen istringstream langsam ist oder sogar fehlschlägt (wenn nicht genügend speicher vorhanden ist). wie kann man einen modifizierten istream schreiben, der direkt auf dem stream operiert, oder noch allgemeiner (falls ich mal zu deque oder so umschwenken möchte) auf iteratoren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410031</guid><dc:creator><![CDATA[lapdancer]]></dc:creator><pubDate>Wed, 23 Jul 2014 09:05:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 09:06:59 GMT]]></title><description><![CDATA[<p>und im anschluss gleich noch eine frage:<br />
gibt es einen standardkonformen weg, einen unsigned char in einen signed char umzuwandeln, ohne dass daten verloren gehen? (und dann entsprechend auch umgekehrt, also sc -&gt; uc)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410033</guid><dc:creator><![CDATA[lapdancer]]></dc:creator><pubDate>Wed, 23 Jul 2014 09:06:59 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 09:42:22 GMT]]></title><description><![CDATA[<p>Was sind denn das für Daten?</p>
<p>Wieso hast Du die als String vorliegen? Benutzt Du eine Bibliothek, die Dir einen string zurückgibt?<br />
Wahrscheinlich hast Du doch eher eine Datei o.ä.?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410042</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Wed, 23 Jul 2014 09:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 09:45:52 GMT]]></title><description><![CDATA[<p>lapdancer schrieb:</p>
<blockquote>
<p>gibt es einen standardkonformen weg, einen unsigned char in einen signed char umzuwandeln, ohne dass daten verloren gehen? (und dann entsprechend auch umgekehrt, also sc -&gt; uc)</p>
</blockquote>
<p>Daten können nur verloren gehen wenn der Zieltyp kleiner ist als der Quelltyp; das ist hier nicht der Fall. Das Bitmuster wird völlig gleich bleiben; nur wird es anders interpretiert. e.g.</p>
<pre><code>unsigned char uc = 254;
signed char sc = uc; // sc ist jetzt negativ (Zweierkomplement)
uc = sc; // uc hat immer noch den Wert 254
</code></pre>
<blockquote>
<p>wie kann man einen modifizierten istream schreiben</p>
</blockquote>
<p>Ich glaube zu wissen was du suchst. Es gibt eine Methode Namens<a href="http://en.cppreference.com/w/cpp/io/basic_streambuf/pubsetbuf" rel="nofollow"> <code>pubsetbuf</code> </a>:</p>
<pre><code>#include &lt;sstream&gt;
#include &lt;iostream&gt;

int main()
{
	std::string str = &quot;54 5 658&quot;;
	std::istringstream stream;
	stream.rdbuf()-&gt;pubsetbuf(&amp;str[0], str.size());

	for (int i; stream &gt;&gt; i;)
		std::cout &lt;&lt; i &lt;&lt; ' ';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2410043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410043</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 23 Jul 2014 09:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 10:06:44 GMT]]></title><description><![CDATA[<p>Da gibt es noch was nettes in Boost;</p>
<pre><code>#include &lt;boost/iostreams/stream.hpp&gt;
#include &lt;iostream&gt;

int main()
{
	std::string str = &quot;54 5 658&quot;;
	boost::iostreams::stream&lt;boost::iostreams::array_source&gt; stream( str.data(), str.size() ); // Funktioniert selbstverständlich auch mit deque

	for (int i; stream &gt;&gt; i;)
		std::cout &lt;&lt; i &lt;&lt; ' ';
}
</code></pre>
<p>Und falls es aus einer Datei kommt - warum eigentlich der Umweg über den String?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410047</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 23 Jul 2014 10:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 10:36:08 GMT]]></title><description><![CDATA[<p>lapdancer schrieb:</p>
<blockquote>
<p>hi, es gibt eine funktion die daten aus einem istream liest und verarbeitet, ich habe diese daten als string vorliegen. es sind jedoch sehr viele daten, sodass ein kopieren in einen istringstream langsam ist oder sogar fehlschlägt (wenn nicht genügend speicher vorhanden ist). wie kann man einen modifizierten istream schreiben, der direkt auf dem stream operiert, oder noch allgemeiner (falls ich mal zu deque oder so umschwenken möchte) auf iteratoren?</p>
</blockquote>
<p>Beschreibe doch bitte, was genau in der Datei steht; bzw. poste hier am besten die ersten Dutzend Zeilen aus dieser Datei, und sage an, was Du damit wirklich vor hast.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Und falls es aus einer Datei kommt - warum eigentlich der Umweg über den String?</p>
</blockquote>
<p>ja - warum eigentlich!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410055</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 23 Jul 2014 10:36:08 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 11:49:54 GMT]]></title><description><![CDATA[<p>Ja, so etwas sieht man leider öfters (bei Anfängern): file -&gt; string -&gt; stream<br />
Bedauerlich!</p>
<p>Werner Salomon: warum hast du nicht schon vor Jahren ein Standardbuch darüber geschrieben? <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/2410080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410080</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 23 Jul 2014 11:49:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 12:33:01 GMT]]></title><description><![CDATA[<p>lapdancer schrieb:</p>
<blockquote>
<p>wie kann man einen modifizierten istream schreiben, der direkt auf dem <s>stream</s> string operiert, [...]</p>
</blockquote>
<p>ein kleiner tippfehler meinerseits von vorhin.</p>
<p>@Furble Wurble<br />
ich habe die daten in einem container weil ich sie generiere um damit dann die funktion zu füttern, die jedoch einen istream erwartet. ebenso brauche ich während dem generieren wahlfreien zugriff auf den speicher.</p>
<p>@Arcoth<br />
ist es nicht ub wenn man z.b. 254 in einem signed char abspeichert? dieser wert liegt ja ausserhalb des wertebereiches dieses typs.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4826">@rest</a><br />
wo hab ich geschrieben dass die daten aus einer datei kommen? sonst würde ich ja einfach einen ifstream aufmachen und den übergeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410086</guid><dc:creator><![CDATA[lapdancer]]></dc:creator><pubDate>Wed, 23 Jul 2014 12:33:01 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 12:46:06 GMT]]></title><description><![CDATA[<p>lapdancer schrieb:</p>
<blockquote>
<p>ist es nicht ub wenn man z.b. 254 in einem signed char abspeichert? dieser wert liegt ja ausserhalb des wertebereiches dieses typs.</p>
</blockquote>
<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf</a> schrieb:</p>
<blockquote>
<p>If the destination type is signed, the value is unchanged if it can be represented in the destination type (and<br />
bit-field width); otherwise, the value is implementation-defined.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2410088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410088</guid><dc:creator><![CDATA[Profiprogrammierer]]></dc:creator><pubDate>Wed, 23 Jul 2014 12:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 12:48:36 GMT]]></title><description><![CDATA[<blockquote>
<p>ist es nicht ub wenn man z.b. 254 in einem signed char abspeichert? dieser wert liegt ja ausserhalb des wertebereiches dieses typs.</p>
</blockquote>
<p>Nein; siehe ProfiProgrammierers Zitat, das existiert schon lange unverändert als §4.7/3.<br />
@ProfiProgrammierer: Künftig bitte in Final Drafts schaun, für C++11 wäre das N3797.</p>
<blockquote>
<p>wo hab ich geschrieben dass die daten aus einer datei kommen?</p>
</blockquote>
<p>Natürlich nirgends. Wo haben wir geschrieben dass wir wissen woher die Daten kommen? Ich schrieb <em>falls</em>...</p>
<p>Wo kommen denn soviele Daten in einem Pack her? Da denkt man einfach an eine Datei.</p>
<blockquote>
<p>ich habe die daten in einem container weil ich sie generiere um damit dann die funktion zu füttern, die jedoch einen istream erwartet.</p>
</blockquote>
<p>... funktioniert denn dann die von mir vorgeschlagene Lösung oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410089</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 23 Jul 2014 12:48:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 13:09:28 GMT]]></title><description><![CDATA[<p>ok, danke, das mit dem signed / unsigned war mir nicht bewusst.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Wo haben wir geschrieben dass wir wissen woher die Daten kommen?</p>
</blockquote>
<p>Th69's post hat sich sehr danach angehört, dich hab ich ja mit dem &quot;<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4826">@rest</a>&quot; eigentlich ausgeschlossen, da ich auf deinen post schon im spezifischen eingegangen bin.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>... funktioniert denn dann die von mir vorgeschlagene Lösung oder nicht?</p>
</blockquote>
<p>sie funktionieren ganz gut (ich habe nur die erste getestet da ich spontan kein boost zur hand habe), leider eben nur für container mit zusammenhängendem speicher.</p>
<p>wenn ich das richtig sehe muss ich nur einen streambuf schreiben, der von streambuf erbt und der zwei iteratoren speichert und mit diesen arbeitet. und dann kann ich einen istream erstellen diesen mit meinem eigenen streambuf konstruieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410092</guid><dc:creator><![CDATA[lapdancer]]></dc:creator><pubDate>Wed, 23 Jul 2014 13:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Wed, 23 Jul 2014 14:08:12 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>@ProfiProgrammierer: Künftig bitte in Final Drafts schaun, für C++11 wäre das N3797.</p>
</blockquote>
<p>Das wäre genau genommen N3291 welches geschützt ist, und die beste Annäherung dafür ist zweifellos N3337 (nur textliche Änderungen gegenüber dem Standard, siehe N3338).</p>
<p>Für C++14 ist es N3936 - ebenfalls geschützt. Dafür wäre gegenwärtig N3797 zusammen mit N3938 zu Rate zu ziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410099</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 23 Jul 2014 14:08:12 GMT</pubDate></item><item><title><![CDATA[Reply to std::istream on Thu, 24 Jul 2014 09:07:36 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p>@ProfiProgrammierer: Künftig bitte in Final Drafts schaun, für C++11 wäre das N3797.</p>
</blockquote>
<p>Das wäre genau genommen N3291 welches geschützt ist, und die beste Annäherung dafür ist zweifellos N3337 (nur textliche Änderungen gegenüber dem Standard, siehe N3338).</p>
<p>Für C++14 ist es N3936 - ebenfalls geschützt. Dafür wäre gegenwärtig N3797 zusammen mit N3938 zu Rate zu ziehen.</p>
</blockquote>
<p>Ich dachte es wäre lediglich ein älterer Draft, danke für die Aufklärung.</p>
<p>N3797 war natürlich ein Tippfehler, ich meine N3337. Das ist meines Wissens nach (wie du ja bestätigt hast) die beste Annäherung, &quot;the latest <em>publicly available</em> draft&quot;.</p>
<blockquote>
<p>leider eben nur für container mit zusammenhängendem speicher.</p>
</blockquote>
<p>Willst du etwa mehrere Gigabyte in einer verketteten Liste speichern?</p>
<p>Ganz grob heruntergetippt:</p>
<pre><code>#include &lt;streambuf&gt;
#include &lt;iterator&gt;
#include &lt;type_traits&gt;

template &lt;typename Iterator,
          typename CharT,
          typename Traits = std::char_traits&lt;CharT&gt;&gt;
class basic_iterator_streambuf : public std::basic_streambuf&lt;CharT, Traits&gt;
{
	Iterator first, current, last;

	using char_type = CharT;
	using traits_type = Traits;

	using int_type = typename traits_type::int_type;

	virtual int_type underflow() override
	{
		if (current != last)
			return *current;

		return traits_type::eof();
	}

	virtual int_type uflow() override
	{
		auto c = underflow();
		if (traits_type::eq_int_type(c, traits_type::eof()))
			return c;

		++current;
		return c;
	}

	int_type pbackfail_noneof_impl( char_type c, std::true_type )
	{
		traits_type::assign(*current, c);
		return traits_type::not_eof( traits_type::eof() );
	}

	int_type pbackfail_noneof_impl( char_type, std::false_type )
	{
		return traits_type::eof();
	}

	int_type pbackfail_impl( std::true_type, int_type c )
	{
		if (first == current)
			return traits_type::eof();

		--current;

		if (not traits_type::eq_int_type(c, traits_type::eof()))
			return pbackfail_noneof_impl( traits_type::to_char_type(c),
			                              std::integral_constant&lt;bool,  std::is_convertible&lt;char_type, typename std::iterator_traits&lt;Iterator&gt;::value_type&gt;::value // Grober Indikator!
			                                                       &amp;&amp;  !std::is_const&lt;typename std::remove_reference&lt;decltype(*current)&gt;::type&gt;::value&gt;{} );

		return traits_type::not_eof( traits_type::eof() );
	}

	int_type pbackfail_impl( std::false_type, int_type )
	{
		return traits_type::eof();
	}

	virtual int_type pbackfail( int_type c = traits_type::eof() ) override
	{
		return pbackfail_impl(std::is_base_of&lt;std::bidirectional_iterator_tag, typename std::iterator_traits&lt;Iterator&gt;::iterator_category&gt;{}, c);
	}

	virtual std::streamsize showmanyc() override
	{
		return std::distance(current, last);
	}

public:

	basic_iterator_streambuf( Iterator first, Iterator last ) :
		first(first), current(first), last(last) {}
};

template &lt;typename I&gt;
using iterator_streambuf = basic_iterator_streambuf&lt;I, char&gt;;

#include &lt;iostream&gt;

int main()
{
	std::string const str = &quot;Hallo Welt!&quot;;
	iterator_streambuf&lt;std::string::const_iterator&gt; buf(str.begin(), str.end());
	std::istream stream(&amp;buf);
	std::string outstr;
	stream &gt;&gt; outstr;
	std::cout &lt;&lt; outstr;
}
</code></pre>
<p>Werner kann das sicher vollständig und richtig machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2410107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2410107</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 24 Jul 2014 09:07:36 GMT</pubDate></item></channel></rss>