<?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[istream_iterator mit eigenem Elementtyp]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Mich beschäftigt gerade das Lokalisieren von bestimmten Datenabschnitten in Binärdateien. Ein solcher Abschnitt kann prinzipiell überall in der Datei stehen und wird durch ein Marker-Wort eingeleitet. Die Länge dieser Markierungen ist dabei konstant - setzen wir sie der Einfachkeit halber mal auf vier fest.</p>
<p>Ich suche nun nach einer möglichst eleganten und generischen Lösung. std::find() mit einem istream_iterator sieht nach einem möglichen Lösungansatz aus, allerdings stellt sich die Frage nach dem richtigen Elementtyp. Mir kam eine Struktur, die aus 4 Zeichen besteht, in den Sinn:</p>
<pre><code class="language-cpp">struct Word4 {
  char a, b, c, d;
}
</code></pre>
<p>Allerdings scheinen dafür noch Operatoren überladen werden zu müssen, denn beim Erstellen erscheint folgender Fehler:</p>
<blockquote>
<p>cd '/home/martin/Entwicklung/C++/Wave/WaveTest/debug/./src' &amp;&amp; WANT_AUTOCONF_2_5=&quot;1&quot; WANT_AUTOMAKE_1_6=&quot;1&quot; LC_MESSAGES=&quot;C&quot; LC_CTYPE=&quot;C&quot; gmake -k wavetest<br />
g++ -DHAVE_CONFIG_H -I. -I/home/martin/Entwicklung/C++/Wave/WaveTest/src -I.. -O0 -g3 -MT wavefile.o -MD -MP -MF .deps/wavefile.Tpo -c -o wavefile.o /home/martin/Entwicklung/C++/Wave/WaveTest/src/wavefile.cpp<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stream_iterator.h: In member function 'void std::istream_iterator&lt;_Tp, _CharT, _Traits, _Dist&gt;::_M_read() [with _Tp = Word4, _CharT = char, _Traits = std::char_traits&lt;char&gt;, _Dist = int]':<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stream_iterator.h:68: instantiated from 'std::istream_iterator&lt;_Tp, _CharT, _Traits, _Dist&gt;::istream_iterator(std::basic_istream&lt;_CharT, _Traits&gt;&amp;) [with _Tp = Word4, _CharT = char, _Traits = std::char_traits&lt;char&gt;, _Dist = int]'<br />
/home/martin/Entwicklung/C++/Wave/WaveTest/src/wavefile.cpp:52: instantiated from here<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stream_iterator.h:119: error: no match for 'operator&gt;&gt;' in '<em>((std::istream_iterator&lt;Word4, char, std::char_traits&lt;char&gt;, int&gt;</em>)this)-&gt;std::istream_iterator&lt;Word4, char, std::char_traits&lt;char&gt;, int&gt;::_M_stream &gt;&gt; ((std::istream_iterator&lt;Word4, char, std::char_traits&lt;char&gt;, int&gt;<em>)this)-&gt;std::istream_iterator&lt;Word4, char, std::char_traits&lt;char&gt;, int&gt;::_M_value'<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:123: note: candidates are: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(std::basic_istream&lt;_CharT, _Traits&gt;&amp; (</em>)(std::basic_istream&lt;_CharT, _Traits&gt;&amp;)) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:127: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(std::basic_ios&lt;_CharT, _Traits&gt;&amp; (<em>)(std::basic_ios&lt;_CharT, _Traits&gt;&amp;)) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:134: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(std::ios_base&amp; (</em>)(std::ios_base&amp;)) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:170: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(bool&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:174: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(short int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:177: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(short unsigned int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:181: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:184: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(unsigned int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:188: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:192: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long unsigned int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:197: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long long int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:201: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long long unsigned int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:206: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(float&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:210: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(double&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:214: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long double&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:218: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(void*&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:242: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(std::basic_streambuf&lt;_CharT, _Traits&gt;*) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
gmake: *** [wavefile.o] Error 1<br />
gmake: Target `wavetest' not remade because of errors.<br />
*** Exited with status: 2 ***</p>
</blockquote>
<p>Leider reichen meine Kenntnisse nicht soweit, um aus der Fehlermeldung schlau zu werden. Offensichtlich muss ich irgendeinen &gt;&gt;-Operator überladen, abeer welchen genau und was muss dieser machen?</p>
<p>Kamm mir jemand von der Community helfen?</p>
<p>Vielen Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244912/istream_iterator-mit-eigenem-elementtyp</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 01:18:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244912.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Jul 2009 16:49:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to istream_iterator mit eigenem Elementtyp on Tue, 07 Jul 2009 16:49:41 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Mich beschäftigt gerade das Lokalisieren von bestimmten Datenabschnitten in Binärdateien. Ein solcher Abschnitt kann prinzipiell überall in der Datei stehen und wird durch ein Marker-Wort eingeleitet. Die Länge dieser Markierungen ist dabei konstant - setzen wir sie der Einfachkeit halber mal auf vier fest.</p>
<p>Ich suche nun nach einer möglichst eleganten und generischen Lösung. std::find() mit einem istream_iterator sieht nach einem möglichen Lösungansatz aus, allerdings stellt sich die Frage nach dem richtigen Elementtyp. Mir kam eine Struktur, die aus 4 Zeichen besteht, in den Sinn:</p>
<pre><code class="language-cpp">struct Word4 {
  char a, b, c, d;
}
</code></pre>
<p>Allerdings scheinen dafür noch Operatoren überladen werden zu müssen, denn beim Erstellen erscheint folgender Fehler:</p>
<blockquote>
<p>cd '/home/martin/Entwicklung/C++/Wave/WaveTest/debug/./src' &amp;&amp; WANT_AUTOCONF_2_5=&quot;1&quot; WANT_AUTOMAKE_1_6=&quot;1&quot; LC_MESSAGES=&quot;C&quot; LC_CTYPE=&quot;C&quot; gmake -k wavetest<br />
g++ -DHAVE_CONFIG_H -I. -I/home/martin/Entwicklung/C++/Wave/WaveTest/src -I.. -O0 -g3 -MT wavefile.o -MD -MP -MF .deps/wavefile.Tpo -c -o wavefile.o /home/martin/Entwicklung/C++/Wave/WaveTest/src/wavefile.cpp<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stream_iterator.h: In member function 'void std::istream_iterator&lt;_Tp, _CharT, _Traits, _Dist&gt;::_M_read() [with _Tp = Word4, _CharT = char, _Traits = std::char_traits&lt;char&gt;, _Dist = int]':<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stream_iterator.h:68: instantiated from 'std::istream_iterator&lt;_Tp, _CharT, _Traits, _Dist&gt;::istream_iterator(std::basic_istream&lt;_CharT, _Traits&gt;&amp;) [with _Tp = Word4, _CharT = char, _Traits = std::char_traits&lt;char&gt;, _Dist = int]'<br />
/home/martin/Entwicklung/C++/Wave/WaveTest/src/wavefile.cpp:52: instantiated from here<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stream_iterator.h:119: error: no match for 'operator&gt;&gt;' in '<em>((std::istream_iterator&lt;Word4, char, std::char_traits&lt;char&gt;, int&gt;</em>)this)-&gt;std::istream_iterator&lt;Word4, char, std::char_traits&lt;char&gt;, int&gt;::_M_stream &gt;&gt; ((std::istream_iterator&lt;Word4, char, std::char_traits&lt;char&gt;, int&gt;<em>)this)-&gt;std::istream_iterator&lt;Word4, char, std::char_traits&lt;char&gt;, int&gt;::_M_value'<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:123: note: candidates are: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(std::basic_istream&lt;_CharT, _Traits&gt;&amp; (</em>)(std::basic_istream&lt;_CharT, _Traits&gt;&amp;)) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:127: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(std::basic_ios&lt;_CharT, _Traits&gt;&amp; (<em>)(std::basic_ios&lt;_CharT, _Traits&gt;&amp;)) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:134: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(std::ios_base&amp; (</em>)(std::ios_base&amp;)) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:170: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(bool&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:174: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(short int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:177: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(short unsigned int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:181: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:184: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(unsigned int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:188: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:192: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long unsigned int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:197: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long long int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:201: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long long unsigned int&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:206: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(float&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:210: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(double&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:214: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(long double&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:218: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(void*&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/istream:242: note: std::basic_istream&lt;_CharT, _Traits&gt;&amp; std::basic_istream&lt;_CharT, _Traits&gt;::operator&gt;&gt;(std::basic_streambuf&lt;_CharT, _Traits&gt;*) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]<br />
gmake: *** [wavefile.o] Error 1<br />
gmake: Target `wavetest' not remade because of errors.<br />
*** Exited with status: 2 ***</p>
</blockquote>
<p>Leider reichen meine Kenntnisse nicht soweit, um aus der Fehlermeldung schlau zu werden. Offensichtlich muss ich irgendeinen &gt;&gt;-Operator überladen, abeer welchen genau und was muss dieser machen?</p>
<p>Kamm mir jemand von der Community helfen?</p>
<p>Vielen Dank im Voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738716</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Tue, 07 Jul 2009 16:49:41 GMT</pubDate></item><item><title><![CDATA[Reply to istream_iterator mit eigenem Elementtyp on Tue, 07 Jul 2009 17:01:27 GMT]]></title><description><![CDATA[<p>Nichts für ungut, aber die Art wie du deine Frage stellst, deutet darauf hin, dass dir das nötige Hintergrundwissen fehlt:</p>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-232010.html</a></p>
<p>Wenn du das verstanden hast, wirst du auch dein Problem lösen können, ansonsten frag nochmal. Und das nächste mal bitte mit etwas Programmcode, denn aus einer solchen Fehlermeldung alleine wird man nicht schlau genug um eine präzise Antwort geben zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738720</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 07 Jul 2009 17:01:27 GMT</pubDate></item><item><title><![CDATA[Reply to istream_iterator mit eigenem Elementtyp on Tue, 07 Jul 2009 19:33:56 GMT]]></title><description><![CDATA[<p>Hallo SeppJ,</p>
<p>danke für die Richtungsweisung - mir ist klar geworden, dass ich selbst festlegen muss, wie ein Objekt aus einem Stream geladen wird (Überladung des &gt;&gt;-Operators).</p>
<p>Mein Code sieht also wie folgt aus:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iterator&gt;
#include &lt;iostream&gt;
#include &lt;algorithm&gt;

struct Word4 {
	char a, b, c, d;

	Word4() {};

	Word4(const std::string&amp; str) {
		this-&gt;a = str[0];
		this-&gt;b = str[1];
		this-&gt;c = str[2];
		this-&gt;d = str[3];
	}
};

std::istream&amp; operator&gt;&gt;(std::istream&amp; lhs, Word4&amp; rhs) {
	lhs.read(reinterpret_cast&lt;char*&gt;(&amp;rhs), sizeof(rhs));
	lhs.seekg(-3, std::ios::cur);
	return lhs:
}

bool operator==(const Word4&amp; lhs, const Word4&amp; rhs) {
	return lhs.a == rhs.a &amp;&amp; lhs.b == rhs.b &amp;&amp; lhs.c == rhs.c &amp;&amp; lhs.d == rhs.d;
}

int main(int argc, char* argv[]) {
  std::ifstream wavefile(argv[1].c_str(), std::ifstream::binary);
  std::istream_iterator&lt;Word4&gt; iterStart(wavefile), iterEnd, iterFound;

  iterFound = std::find(iterStart, iterEnd, std::string(&quot;data&quot;));
  if (iterFound == iterEnd) {
    std::cout &lt;&lt; &quot;NOT FOUND&quot; &lt;&lt; std::endl;
  } else {
    std::cout &lt;&lt; &quot;FOUND AT POSITION &quot; &lt;&lt; std::distance(iterStart, iterFound) &lt;&lt; std::endl;		
  };    
}
</code></pre>
<p>Die Ausgabe, ob das Element gefunden wurde oder nicht funktioniert nun korrekt. Allerdings bringt es mir nichts, allein die Existenz festzustellen - ich benötige die Position. Leider gibt mir std::distance immer 0 zurück, warum ist das so? Laut Dokumentation sollte das doch die Distanz zwischen zwei Iteratoren angeben, in meinem Fall also der Abstand vom Dateianfang.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738816</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Tue, 07 Jul 2009 19:33:56 GMT</pubDate></item><item><title><![CDATA[Reply to istream_iterator mit eigenem Elementtyp on Tue, 07 Jul 2009 21:53:07 GMT]]></title><description><![CDATA[<p>Chewie83 schrieb:</p>
<blockquote>
<p>Die Ausgabe, ob das Element gefunden wurde oder nicht funktioniert nun korrekt. Allerdings bringt es mir nichts, allein die Existenz festzustellen - ich benötige die Position. Leider gibt mir std::distance immer 0 zurück, warum ist das so? Laut Dokumentation sollte das doch die Distanz zwischen zwei Iteratoren angeben, in meinem Fall also der Abstand vom Dateianfang.</p>
</blockquote>
<p>iterEnd wird nirgendwo gesetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738893</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 07 Jul 2009 21:53:07 GMT</pubDate></item><item><title><![CDATA[Reply to istream_iterator mit eigenem Elementtyp on Tue, 07 Jul 2009 22:59:46 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>iterEnd wird nirgendwo gesetzt.</p>
</blockquote>
<p>Daran liegt es nicht, vor allem wurde <code>iterEnd</code> korrekt angelegt.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8631">@Chewie83</a>,<br />
1. Dein Code hat Abtippfehler drin. Wieso verwendest du kein Copy&amp;Paste?<br />
2. Der Hauptfehler besteht darin, dass du <code>istream_iterator</code> Objekte vergleichst. Das passiert nämlich in <code>std::distance</code> , weil <code>istream_iterator</code> kein Random Access Iterator ist. Der erste übergebene Iterator wird solange erhöht, bis er gleich dem zweiten ist. Nebenher wird ein Zähler mitgeführt. Nun, zwei <code>istream_iterator</code> Objekte sind per Standard dann gleich, wenn sie auf den gleichen Stream verweisen. Also sind sie sofort gleich und die Distanz ist 0.<br />
3. Auch wenn dein Vorhaben gelingen würde, dann hast du den Fehler gemacht, dass ein <code>istream_iterator</code> intern nur einen Zeiger auf den Stream hält. Also müsstest du zuerst den Stream wieder auf die Startposition setzen und alle Lesevorgänge nochmals ausführen, weil eben über die Erhöhung des Iterators, wie in Punkt 2 beschrieben, die Distanz ermittelt wird.<br />
4. Wie du es dir schon fast denken kannst, für sowas ist der <code>istream_iterator</code> nicht gedacht. Mit dem <code>istream_iterator</code> soll man einmal drüber gehen und dann die Iteratoren wegschmeissen. Sie sind wie Einweg-Pettflaschen <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>
<p>Als Lösung bietet es sich an, dass man entweder hier keinen <code>istream_iterator</code> benutzt und es auf &quot;normale&quot; Wege löst oder eine eigene <code>istream_iterator</code> Klasse erfindet, welche vor dem auslesen jeweils die Position speichert. Wäre ziemlich einfach zu realisieren.<br />
Hier findest du eine Implementations einer <code>istream_iterator</code> Klasse:<br />
<a href="http://www.cplusplus.com/reference/std/iterator/istream_iterator/" rel="nofollow">http://www.cplusplus.com/reference/std/iterator/istream_iterator/</a></p>
<p>Die kann man leicht selber erweitern.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738905</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 07 Jul 2009 22:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to istream_iterator mit eigenem Elementtyp on Wed, 08 Jul 2009 21:04:06 GMT]]></title><description><![CDATA[<p>Hallo Dravere,</p>
<p>danke für Deine Antwort. Mit viel Mühe habe ich ausgehend vom verlinkten Code eine Klasse <code>istream_pos_iterator</code> erstellt. Sie sieht wie folgt aus:</p>
<pre><code class="language-cpp">namespace std
{	
	template &lt;class T, class charT=char, class traits=char_traits&lt;charT&gt;, class Distance=ptrdiff_t&gt;
	class istream_pos_iterator : public iterator&lt;input_iterator_tag, T, Distance, const T*, const T&amp;&gt;
	{
		basic_istream&lt;charT,traits&gt;* in_stream;
		T value;
		int position;

		public:
			typedef charT char_type;
			typedef traits traits_type;
			typedef basic_istream&lt;charT,traits&gt; istream_type;
			istream_pos_iterator() : in_stream ( 0 ) {}
			istream_pos_iterator ( istream_type&amp; s ) : in_stream ( &amp;s ), position(-1) { ++*this; }
			istream_pos_iterator ( const istream_pos_iterator&lt;T,charT,traits,Distance&gt;&amp; x )
					: in_stream ( x.in_stream ), value ( x.value ), position(x.position) {}
			~istream_pos_iterator() {}

			const T&amp; operator*() const { return value; }
			const T* operator-&gt;() const { return &amp;value; }			

			istream_pos_iterator&lt;T,charT,traits,Distance&gt;&amp; operator++()
			{
				position = in_stream-&gt;tellg();
				if ( in_stream &amp;&amp; ! ( *in_stream &gt;&gt; value ) ) in_stream=0;
				return *this;
			}
			istream_pos_iterator&lt;T,charT,traits,Distance&gt; operator++ ( int )
			{
				istream_pos_iterator&lt;T,charT,traits,Distance&gt; tmp = *this;
				++*this;
				return tmp;
			}

			int tell() { return position; }

			bool equal(const istream_pos_iterator&lt;T,charT,traits,Distance&gt;&amp; o) const
			{
				if (!this-&gt;in_stream) {
					return (!o.in_stream);  // EQUAL if both are EOF iterators, otherwise NOT EQUAL
				}
				return this-&gt;position == o.position;  // Otherwise compare position
			}
	};

	template &lt;class T, class charT, class traits, class Distance&gt;
	bool operator==(const istream_pos_iterator&lt;T, charT, traits, Distance&gt;&amp; lhs, const istream_pos_iterator&lt;T, charT, traits, Distance&gt;&amp; rhs) {
		return lhs.equal(rhs);
	}

	template &lt;class T, class charT, class traits, class Distance&gt;
	bool operator!=(const istream_pos_iterator&lt;T, charT, traits, Distance&gt;&amp; lhs, const istream_pos_iterator&lt;T, charT, traits, Distance&gt;&amp; rhs) {
		return !lhs.equal(rhs);
	}
}
</code></pre>
<p>Kann man das so stehen lassen? Was mir nicht gefällt ist die Funktion <code>equal</code> , aber ich hab es partout nicht geschafft, den Vergleichsoperator als <code>friend</code> zu deklarieren. Wie sähe die Deklaration in diesem Fall aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739434</guid><dc:creator><![CDATA[Chewie83]]></dc:creator><pubDate>Wed, 08 Jul 2009 21:04:06 GMT</pubDate></item></channel></rss>