<?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[wie funktioniert equal()]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte aus einer Datei heraus pro bestimmtem Datensatz eine Zeile auslesen und aus dieser Zeile, die mehrere Zahlen beinhaltet, die Zahlen speichern und anschließend weiterverarbeiten.<br />
Die Datei sieht wie folgt aus:</p>
<blockquote>
<p>SN: 0912009913<br />
lot: 9<br />
wafer: 12<br />
position: C14<br />
U(Br) Hamamatsu, T=20C: 418<br />
U(R) Hamamatsu, M=100 T=20C: 390<br />
Id Hamamatsu, M=100 T=20C: 4.2<br />
QE:<br />
light fiber correction factor:<br />
C:<br />
U_Br(fit): 379.095094</p>
<p>raw data:<br />
SN Temp rad grid grid_pos M Ubias Id M(for_1/M_dM/dV) 1/M_dM/dV</p>
<p>fit data:<br />
SN Temp rad grid grid_pos M Ubias Id 1/M_dM/dV<br />
0912009913 -25.1 0 215 10 150 360.26770007 -0.157245 5.997866</p>
<p>SN: 0912009897<br />
lot: 9<br />
wafer: 12<br />
position: D10<br />
U(Br) Hamamatsu, T=20C: 412<br />
U(R) Hamamatsu, M=100 T=20C: 383<br />
Id Hamamatsu, M=100 T=20C: 7.2<br />
QE:<br />
light fiber correction factor:<br />
C:<br />
U_Br(fit): 372.275581</p>
<p>raw data:<br />
SN Temp rad grid grid_pos M Ubias Id M(for_1/M_dM/dV) 1/M_dM/dV</p>
<p>fit data:<br />
SN Temp rad grid grid_pos M Ubias Id 1/M_dM/dV<br />
0912009897 -25.1 0 215 9 150 353.638682453 -0.14<br />
(...)</p>
</blockquote>
<p>Um die Zahlen zu bekommen, würde ich gerne von der Stelle &quot;fit data:&quot; an die nächste Zeile ignorieren und die darauf dann auslesen. Das macht mir allerdings Schwierigkeiten. Das Auslesen der Datei mache ich per getline und um zu überprüfen, ob die Zeile mit &quot;fit&quot; beginnt, versuche ich &quot;equal()&quot; zu verwenden.</p>
<pre><code>int compare(int start = 378, int ignore_matched_apds = 1, int select_grids = 0, const char *inputfile=&quot;Test.txt&quot;, const char *apds_glued_file=&quot;apds_glued.txt&quot;, const char *grids_file=&quot;grids.txt&quot;, const char *outputfile=&quot;apds_matched.txt&quot;, const char *simple_outputfile=&quot;simple_apds_matched.txt&quot;)
{

	ifstream database, glued_apds, grids;										
	ofstream output(outputfile), simple_output(simple_outputfile);						
	string database_line, glued_apds_line, grids_line;
	vector&lt;string&gt; vector_database_lines; 
	string database_line_begin = &quot;fit&quot;;

	float SN, T, rad, grid, grid_pos, M, Ubias, Id, dM;

	int max = 0;
	vector&lt;string&gt;::iterator it;

	database.open(inputfile);							
	if(!database) cerr &lt;&lt; &quot;File \&quot;&quot; &lt;&lt; inputfile &lt;&lt; &quot;\&quot; not found\n&quot; &lt;&lt; endl;							
	else
	{		
		cout &lt;&lt; &quot;Open file \&quot;&quot; &lt;&lt; inputfile &lt;&lt; &quot;\&quot; as database&quot; &lt;&lt; endl;

		while(getline(database,database_line))		
		{			
			if(equal(database_line.begin(), database_line.end(), database_line_begin.begin()))
			{		
				getline(database,database_line);
				getline(database,database_line);
				cout &lt;&lt; database_line &lt;&lt; endl;
				output &lt;&lt; database_line &lt;&lt; endl;
				vector_database_lines.push_back(database_line); 
			}
		}	
		if(vector_database_lines.size()==0)	
		{
			cout &lt;&lt; &quot;Reading from \&quot;&quot; &lt;&lt; inputfile &lt;&lt; &quot;\&quot; failed&quot; &lt;&lt; endl; 
			return (-1);
		}	
		else max = vector_database_lines.size();
	}
}
</code></pre>
<p>Weiß jemand Rat ? Vielen Dank schonmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339769/wie-funktioniert-equal</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 08:36:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339769.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Sep 2016 13:33:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 13:33:04 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich möchte aus einer Datei heraus pro bestimmtem Datensatz eine Zeile auslesen und aus dieser Zeile, die mehrere Zahlen beinhaltet, die Zahlen speichern und anschließend weiterverarbeiten.<br />
Die Datei sieht wie folgt aus:</p>
<blockquote>
<p>SN: 0912009913<br />
lot: 9<br />
wafer: 12<br />
position: C14<br />
U(Br) Hamamatsu, T=20C: 418<br />
U(R) Hamamatsu, M=100 T=20C: 390<br />
Id Hamamatsu, M=100 T=20C: 4.2<br />
QE:<br />
light fiber correction factor:<br />
C:<br />
U_Br(fit): 379.095094</p>
<p>raw data:<br />
SN Temp rad grid grid_pos M Ubias Id M(for_1/M_dM/dV) 1/M_dM/dV</p>
<p>fit data:<br />
SN Temp rad grid grid_pos M Ubias Id 1/M_dM/dV<br />
0912009913 -25.1 0 215 10 150 360.26770007 -0.157245 5.997866</p>
<p>SN: 0912009897<br />
lot: 9<br />
wafer: 12<br />
position: D10<br />
U(Br) Hamamatsu, T=20C: 412<br />
U(R) Hamamatsu, M=100 T=20C: 383<br />
Id Hamamatsu, M=100 T=20C: 7.2<br />
QE:<br />
light fiber correction factor:<br />
C:<br />
U_Br(fit): 372.275581</p>
<p>raw data:<br />
SN Temp rad grid grid_pos M Ubias Id M(for_1/M_dM/dV) 1/M_dM/dV</p>
<p>fit data:<br />
SN Temp rad grid grid_pos M Ubias Id 1/M_dM/dV<br />
0912009897 -25.1 0 215 9 150 353.638682453 -0.14<br />
(...)</p>
</blockquote>
<p>Um die Zahlen zu bekommen, würde ich gerne von der Stelle &quot;fit data:&quot; an die nächste Zeile ignorieren und die darauf dann auslesen. Das macht mir allerdings Schwierigkeiten. Das Auslesen der Datei mache ich per getline und um zu überprüfen, ob die Zeile mit &quot;fit&quot; beginnt, versuche ich &quot;equal()&quot; zu verwenden.</p>
<pre><code>int compare(int start = 378, int ignore_matched_apds = 1, int select_grids = 0, const char *inputfile=&quot;Test.txt&quot;, const char *apds_glued_file=&quot;apds_glued.txt&quot;, const char *grids_file=&quot;grids.txt&quot;, const char *outputfile=&quot;apds_matched.txt&quot;, const char *simple_outputfile=&quot;simple_apds_matched.txt&quot;)
{

	ifstream database, glued_apds, grids;										
	ofstream output(outputfile), simple_output(simple_outputfile);						
	string database_line, glued_apds_line, grids_line;
	vector&lt;string&gt; vector_database_lines; 
	string database_line_begin = &quot;fit&quot;;

	float SN, T, rad, grid, grid_pos, M, Ubias, Id, dM;

	int max = 0;
	vector&lt;string&gt;::iterator it;

	database.open(inputfile);							
	if(!database) cerr &lt;&lt; &quot;File \&quot;&quot; &lt;&lt; inputfile &lt;&lt; &quot;\&quot; not found\n&quot; &lt;&lt; endl;							
	else
	{		
		cout &lt;&lt; &quot;Open file \&quot;&quot; &lt;&lt; inputfile &lt;&lt; &quot;\&quot; as database&quot; &lt;&lt; endl;

		while(getline(database,database_line))		
		{			
			if(equal(database_line.begin(), database_line.end(), database_line_begin.begin()))
			{		
				getline(database,database_line);
				getline(database,database_line);
				cout &lt;&lt; database_line &lt;&lt; endl;
				output &lt;&lt; database_line &lt;&lt; endl;
				vector_database_lines.push_back(database_line); 
			}
		}	
		if(vector_database_lines.size()==0)	
		{
			cout &lt;&lt; &quot;Reading from \&quot;&quot; &lt;&lt; inputfile &lt;&lt; &quot;\&quot; failed&quot; &lt;&lt; endl; 
			return (-1);
		}	
		else max = vector_database_lines.size();
	}
}
</code></pre>
<p>Weiß jemand Rat ? Vielen Dank schonmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509859</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Tue, 27 Sep 2016 13:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 13:42:02 GMT]]></title><description><![CDATA[<p>Nein, denn niemand weiß, welches Problem du hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509861</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 27 Sep 2016 13:42:02 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 13:47:05 GMT]]></title><description><![CDATA[<p>Also zum einen ist es scheinbar egal, auf welchen String er vergleichen soll. Selbst wenn der String nicht vorhanden ist, geht er in die Schleife rein.<br />
Andererseits kann ich, wenn ich mit getline innerhalb der Schleife herumspiele, durchaus den Output steuern. Das mag sinnig wirken aber dennoch nicht gezielt.<br />
Bestes Resultat war bislang die gewünschte Zeile + die vorige. Aber nie die einzelne. Ich werde da nicht schlau draus..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509864</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Tue, 27 Sep 2016 13:47:05 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 14:18:14 GMT]]></title><description><![CDATA[<p>std::equal() geht davon aus, dass die zweite Sequence (der dritte Parameter) genau so lang, oder länger ist als die erste Sequence (die ersten beiden Parameter). Wenn immer database_line länger ist als database_line_begin, hast Du schon undefined behavior. Guck Dir mal an, wie regular expressions funktionieren, mit denen sollte Dein Problem mit einem Drei-Zeiler lösbar sein.</p>
<p>mfg Torsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509870</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Tue, 27 Sep 2016 14:18:14 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 14:23:18 GMT]]></title><description><![CDATA[<p>Progressive schrieb:</p>
<blockquote>
<p>Also zum einen ist es scheinbar egal, auf welchen String er vergleichen soll. Selbst wenn der String nicht vorhanden ist, geht er in die Schleife rein.</p>
</blockquote>
<p>if ist keine Schleife.</p>
<p>Die Bedingung dürfte <strong>nie</strong> true sein, da du immer verschieden lange Strings vergleichst. Allerdings erzeugts du hier undefiniertes Verhalten, da du über das Ende des zweiten Strings hinaus liest.<br />
Ich würde</p>
<pre><code class="language-cpp">if(database_line.substr(0,database_line_begin.size()) == database_line_begin)
</code></pre>
<p>vorschlagen (ungetestet!).</p>
<p>Progressive schrieb:</p>
<blockquote>
<p>Andererseits kann ich, wenn ich mit getline innerhalb der Schleife herumspiele, durchaus den Output steuern. Das mag sinnig wirken aber dennoch nicht gezielt.<br />
Bestes Resultat war bislang die gewünschte Zeile + die vorige. Aber nie die einzelne. Ich werde da nicht schlau draus..</p>
</blockquote>
<p>Ich habe keine Ahnung, was du damit sagen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509871</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 27 Sep 2016 14:23:18 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 14:38:03 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Progressive schrieb:</p>
<blockquote>
<p>Also zum einen ist es scheinbar egal, auf welchen String er vergleichen soll. Selbst wenn der String nicht vorhanden ist, geht er in die Schleife rein.</p>
</blockquote>
<p>if ist keine Schleife.</p>
<p>Die Bedingung dürfte <strong>nie</strong> true sein, da du immer verschieden lange Strings vergleichst. Allerdings erzeugts du hier undefiniertes Verhalten, da du über das Ende des zweiten Strings hinaus liest.<br />
Ich würde</p>
<pre><code class="language-cpp">if(database_line.substr(0,database_line_begin.size()) == database_line_begin)
</code></pre>
<p>vorschlagen (ungetestet!).</p>
</blockquote>
<p>Ja, nicht Schleife, falscher Ausdruck, meinte den Programmblock der if-Bedingung.<br />
Ok, danke, werde ich gleich mal versuchen! Dessen ungeachtet, aus Verständniszwecken: Der zweite String, also &quot;<em>string database_line_begin = &quot;fit&quot;</em>&quot; hat doch aber ein definiertes Ende ?</p>
<p>Torsten Robitzki schrieb:</p>
<blockquote>
<p>std::equal() geht davon aus, dass die zweite Sequence (der dritte Parameter) genau so lang, oder länger ist als die erste Sequence (die ersten beiden Parameter). Wenn immer database_line länger ist als database_line_begin, hast Du schon undefined behavior. Guck Dir mal an, wie regular expressions funktionieren, mit denen sollte Dein Problem mit einem Drei-Zeiler lösbar sein.</p>
<p>mfg Torsten</p>
</blockquote>
<p>Also wenn die zweite Sequenz gleich lang oder länger sein soll, kann ich ja einfach die Reihenfolge ändern: <em>if(equal(database_line_begin.begin(), database_line_begin.end(), database_line.begin()))</em><br />
Das funktioniert sogar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <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="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <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="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <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="🙄"
    /><br />
Werde mir diese regular expressions dennoch mal angucken! Vielen Dank soweit!</p>
<p>Ich bin nirgends darauf gestoßen, dass der zweite String gleich lang/länger sein muss..<br />
Gibt es ein umfangreiches aber übersichtliches Handbuch über alle C++-Befehle, das ihr empfehlen könnt ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509874</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Tue, 27 Sep 2016 14:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 14:59:34 GMT]]></title><description><![CDATA[<p>Progressive schrieb:</p>
<blockquote>
<p>Gibt es ein umfangreiches aber übersichtliches Handbuch über alle C++-Befehle, das ihr empfehlen könnt ?</p>
</blockquote>
<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf</a><br />
<a href="http://en.cppreference.com" rel="nofollow">http://en.cppreference.com</a></p>
<p>Progressive schrieb:</p>
<blockquote>
<p>Dessen ungeachtet, aus Verständniszwecken: Der zweite String, also &quot;<em>string database_line_begin = &quot;fit&quot;</em>&quot; hat doch aber ein definiertes Ende ?</p>
</blockquote>
<p>Ja, aber woher weiß equal, wo das Ende ist?</p>
<p><a href="http://en.cppreference.com/w/cpp/algorithm/equal" rel="nofollow">http://en.cppreference.com/w/cpp/algorithm/equal</a> schrieb:</p>
<blockquote>
<p>Returns true if the range [first1, last1) is equal to the range [first2, first2 + (last1 - first1)), and false otherwise</p>
</blockquote>
<p>Es wird also bis first2 + (last1 - first1) gelesen, d.h. meistens zu weit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509878</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 27 Sep 2016 14:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 15:30:42 GMT]]></title><description><![CDATA[<p>Progressive schrieb:</p>
<blockquote>
<p>Werde mir diese regular expressions dennoch mal angucken! Vielen Dank soweit!</p>
</blockquote>
<p>'regular expressions' wären hier IMHO Kanonen auf Spatzen. Letzlich brauchst Du nur auf &quot;fit data:&quot; abzufragen - etwa so:</p>
<pre><code>#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;limits&gt;
#include &lt;vector&gt;

std::istream&amp; skipline( std::istream&amp; in )
{
    return in.ignore( std::numeric_limits&lt; std::streamsize &gt;::max(), '\n' );
}

struct Fit
{
    int rad, grid, grid_pos, M;
    double temp, Ubias, Id, proM_dM_dV;
};

std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Fit&amp; e )
{   // SN Temp rad grid grid_pos M Ubias Id 1/M_dM/dV
    std::string SN;  // .. brauchst Du das?      
    return in &gt;&gt; SN &gt;&gt; e.temp &gt;&gt; e.rad &gt;&gt; e.grid &gt;&gt; e.grid_pos &gt;&gt; e.M &gt;&gt; e.Ubias &gt;&gt; e.Id &gt;&gt; e.proM_dM_dV;
}

int main()
{
    using namespace std;
    vector&lt; Fit &gt; all_fits;
    ifstream database(&quot;Test.txt&quot;);
    if( !database.is_open() )
    {
        cerr &lt;&lt; &quot;Fehler beim Oeffnen der Datei&quot; &lt;&lt; endl;
        return 0;
    }
    for( Fit e; database; )
    {
        for( string token; database &gt;&gt; token &amp;&amp; (token != &quot;fit&quot; || (database &gt;&gt; token &amp;&amp; token != &quot;data:&quot;) )
            ; database &gt;&gt; skipline )
            ;
        for( auto i=0; i&lt;2; ++i )
            database &gt;&gt; skipline;
        if( database &gt;&gt; e )
            all_fits.push_back( e );
    }
    cout &lt;&lt; all_fits.size() &lt;&lt; &quot; Eintraege gelesen&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509882</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 27 Sep 2016 15:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 16:55:24 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Progressive schrieb:</p>
<blockquote>
<p>Gibt es ein umfangreiches aber übersichtliches Handbuch über alle C++-Befehle, das ihr empfehlen könnt ?</p>
</blockquote>
<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf</a><br />
<a href="http://en.cppreference.com" rel="nofollow">http://en.cppreference.com</a></p>
</blockquote>
<p>Danke!</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Progressive schrieb:</p>
<blockquote>
<p>Dessen ungeachtet, aus Verständniszwecken: Der zweite String, also &quot;<em>string database_line_begin = &quot;fit&quot;</em>&quot; hat doch aber ein definiertes Ende ?</p>
</blockquote>
<p>Ja, aber woher weiß equal, wo das Ende ist?</p>
<p><a href="http://en.cppreference.com/w/cpp/algorithm/equal" rel="nofollow">http://en.cppreference.com/w/cpp/algorithm/equal</a> schrieb:</p>
<blockquote>
<p>Returns true if the range [first1, last1) is equal to the range [first2, first2 + (last1 - first1)), and false otherwise</p>
</blockquote>
<p>Es wird also bis first2 + (last1 - first1) gelesen, d.h. meistens zu weit.</p>
</blockquote>
<p>Wenn man einen String definiert, dann ist das Ende doch vorgegeben. Warum wird z.B. &quot;string str = &quot;Content&quot;; nicht ein entsprechendes Zeichen nach dem String-Inhalt gesetzt ?</p>
<p>Danke, Werner!<br />
Es funktioniert aber das muss ich erstmal verstehen. Hat insofern den Vorteil, als dass da eh viel auftaucht, was ich mir ohnehin aneignen muss <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Bedeutet:</p>
<pre><code>for( string token; database &gt;&gt; token &amp;&amp; (token != &quot;fit&quot; || (database &gt;&gt; token &amp;&amp; token != &quot;data:&quot;) )
            ; database &gt;&gt; skipline )
            ;
        for( auto i=0; i&lt;2; ++i )
            database &gt;&gt; skipline;
        if( database &gt;&gt; e )
            all_fits.push_back( e );
</code></pre>
<p>dass solange aus der Datei gelesen wird, bis &quot;fit&quot; oder &quot;data&quot; auftauchen, die nächsten zwei Zeilen verworfen werden und die Zeile darauf dann in den vector geschrieben wird ?<br />
Müsste es dann aber nicht token == &quot;fit&quot;, anstelle von token != &quot;fit&quot; heißen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509891</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Tue, 27 Sep 2016 16:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 17:12:21 GMT]]></title><description><![CDATA[<p>Wie kann ich mir den Inhalt des Vektors eigentlich ansehen ?</p>
<p>Mittels &quot;cout &lt;&lt; database_vector[0] &lt;&lt; endl;&quot; funktioniert das irgendwie nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509895</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Tue, 27 Sep 2016 17:12:21 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 17:33:56 GMT]]></title><description><![CDATA[<p>Eigentlich brauchst du nur zu checken, ob eine Zeile mit einer Zahl beginnt.<br />
Ungefähr so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;limits&gt;
#include &lt;cctype&gt;

int main(){
    std::ifstream stream{&quot;f&quot;};
    std::string line;

    while(stream){
        if(std::isdigit(stream.peek())){
            std::getline(stream, line);
            std::cout &lt;&lt; line &lt;&lt; '\n';
            // oder einfach weiter mit dem Stream parsen
        }

        else
            stream.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2509896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509896</guid><dc:creator><![CDATA[einfach]]></dc:creator><pubDate>Tue, 27 Sep 2016 17:33:56 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 17:41:36 GMT]]></title><description><![CDATA[<p>Progressive schrieb:</p>
<blockquote>
<p>Wenn man einen String definiert, dann ist das Ende doch vorgegeben. Warum wird z.B. &quot;string str = &quot;Content&quot;; nicht ein entsprechendes Zeichen nach dem String-Inhalt gesetzt ?</p>
</blockquote>
<p>Woher weiß equal, dass es ein String ist?<br />
Woher weiß equal, welches Zeichen am Ende steht?<br />
Welches Zeichen soll einen std::vector&lt;int&gt; beenden?<br />
Welches Zeichen soll einen std::vector&lt;Foo&gt; beenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509897</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 27 Sep 2016 17:41:36 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 20:03:42 GMT]]></title><description><![CDATA[<p>einfach schrieb:</p>
<blockquote>
<p>Eigentlich brauchst du nur zu checken, ob eine Zeile mit einer Zahl beginnt.<br />
Ungefähr so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;limits&gt;
#include &lt;cctype&gt;

int main(){
    std::ifstream stream{&quot;f&quot;};
    std::string line;

    while(stream){
        if(std::isdigit(stream.peek())){
            std::getline(stream, line);
            std::cout &lt;&lt; line &lt;&lt; '\n';
            // oder einfach weiter mit dem Stream parsen
        }

        else
            stream.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
    }
}
</code></pre>
</blockquote>
<p>Gefällt mir auch!</p>
<p>Habe es mit dem Drumherum von Werner kombiniert:</p>
<pre><code>(...)for(dataset parameter; database;)									
	{
		if(isdigit(database.peek()))	
		{
			if(database &gt;&gt; parameter) database_vector.push_back(parameter);		
		}		
		else database.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');	
	}(...)
</code></pre>
<p>manni66 schrieb:</p>
<blockquote>
<p>Progressive schrieb:</p>
<blockquote>
<p>Wenn man einen String definiert, dann ist das Ende doch vorgegeben. Warum wird z.B. &quot;string str = &quot;Content&quot;; nicht ein entsprechendes Zeichen nach dem String-Inhalt gesetzt ?</p>
</blockquote>
<p>Woher weiß equal, dass es ein String ist?<br />
Woher weiß equal, welches Zeichen am Ende steht?<br />
Welches Zeichen soll einen std::vector&lt;int&gt; beenden?<br />
Welches Zeichen soll einen std::vector&lt;Foo&gt; beenden?</p>
</blockquote>
<p>Weil es als solches definiert wurde ?<br />
Wenn es eines am Ende eines Strings gäbe, könnte es darauf prüfen.<br />
Das liegt nicht in meiner Entscheidungsgewalt :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509898</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Tue, 27 Sep 2016 20:03:42 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 27 Sep 2016 20:13:04 GMT]]></title><description><![CDATA[<p>Wie gebe ich denn den Vektor nun aus ?</p>
<p>Ich habe jetzt:</p>
<pre><code>istream&amp; skipline(istream&amp; in)	
{
    return in.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n' );		
}

struct dataset		
{
    int rad, grid, grid_pos, M;
    double temp, Ubias, Id, proM_dM_dV;
};

istream&amp; operator&gt;&gt;(istream&amp; in, dataset&amp; parameter)	
{ 
    string SN;      
    return in &gt;&gt; SN &gt;&gt; parameter.temp &gt;&gt; parameter.rad &gt;&gt; parameter.grid &gt;&gt; parameter.grid_pos &gt;&gt; parameter.M &gt;&gt; parameter.Ubias &gt;&gt; parameter.Id &gt;&gt; parameter.proM_dM_dV;	
}

int compare(int start = 378, int ignore_matched_apds = 1, int select_grids = 0, const char *inputfile=&quot;Test.txt&quot;, const char *apds_glued_file=&quot;apds_glued.txt&quot;, const char *grids_file=&quot;grids.txt&quot;, const char *outputfile=&quot;apds_matched.txt&quot;, const char *simple_outputfile=&quot;simple_apds_matched.txt&quot;)
{    
	ifstream database(inputfile), glued_apds, grids;				
	ofstream output(outputfile), simple_output(simple_outputfile);	
	vector&lt;dataset&gt; database_vector;		

	if(!database)
	{
		cerr &lt;&lt; &quot;File \&quot;&quot; &lt;&lt; inputfile &lt;&lt; &quot;\&quot; not found\n&quot; &lt;&lt; endl; 
		return(-1);
	}
	else cout &lt;&lt; &quot;Open \&quot;&quot; &lt;&lt; inputfile &lt;&lt; &quot;\&quot; as database&quot; &lt;&lt; endl;
	for(dataset parameter; database;)		
	{
		if(isdigit(database.peek()))		
		{
			if(database &gt;&gt; parameter) database_vector.push_back(parameter);		
		}		
		else database.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');	
	}
	if(database_vector.size()==0)
	{
		cout &lt;&lt; &quot;Reading from \&quot;&quot; &lt;&lt; inputfile &lt;&lt; &quot;\&quot; failed. No parameters found.&quot; &lt;&lt; endl; 
		return(-1);
	}
	cout &lt;&lt; database_vector.size() &lt;&lt; &quot; entries read out&quot; &lt;&lt; endl;
	for(std::vector&lt;dataset&gt;::iterator it = database_vector.begin(); it != database_vector.end(); it++) cout &lt;&lt; *it &lt;&lt; endl;	
	return 0;
}
</code></pre>
<p>Aber das funktioniert nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509900</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Tue, 27 Sep 2016 20:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Wed, 28 Sep 2016 06:57:05 GMT]]></title><description><![CDATA[<p>Analog zum Einlesen mittels &gt;&gt; einen Ausgabe-Operator &lt;&lt; definieren:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; out, const dataset&amp; parameter)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2509928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509928</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 28 Sep 2016 06:57:05 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Wed, 28 Sep 2016 09:12:23 GMT]]></title><description><![CDATA[<p>Progressive schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Progressive schrieb:</p>
<blockquote>
<p>Wenn man einen String definiert, dann ist das Ende doch vorgegeben. Warum wird z.B. &quot;string str = &quot;Content&quot;; nicht ein entsprechendes Zeichen nach dem String-Inhalt gesetzt ?</p>
</blockquote>
<p>Woher weiß equal, dass es ein String ist?<br />
Woher weiß equal, welches Zeichen am Ende steht?<br />
Welches Zeichen soll einen std::vector&lt;int&gt; beenden?<br />
Welches Zeichen soll einen std::vector&lt;Foo&gt; beenden?</p>
</blockquote>
<p>Weil es als solches definiert wurde ?</p>
</blockquote>
<p>Du übergibst keinen String sondern einen Iterator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509950</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 28 Sep 2016 09:12:23 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Mon, 10 Oct 2016 16:17:10 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>Analog zum Einlesen mittels &gt;&gt; einen Ausgabe-Operator &lt;&lt; definieren:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; out, const dataset&amp; parameter)
</code></pre>
</blockquote>
<p>Hi, habe in der Zwischenzeit generell mich mal etwas über C++ eingelesen. Leider traf ich nie auf den o.a. Fall bzw. konnte ihn darauf abstrahieren.</p>
<p>Was bedeutet denn <em>ostream&amp; operator&lt;&lt;(ostream&amp; out, const dataset&amp; parameter)</em> ?<br />
Bei <a href="http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt" rel="nofollow">http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt</a> steht <em>std::basic_ostream::operator&lt;&lt; Inserts data into the stream</em>.</p>
<p>Wo/wie wirkt denn out ? Meinem Verständnis nach habe ich bislang zwei streams: Jeweils einen für die Dateieinlese und einen für die Dateiauslese (in meinem Beispiel database und output). Was macht daher out und in bzw. was macht der operator konkret ?</p>
<p>Und was ist &quot;parameter&quot; ? Definiert wurde es ja glaube als Variable vom Typ dataset. Aber warum ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511132</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Mon, 10 Oct 2016 16:17:10 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 11 Oct 2016 08:40:31 GMT]]></title><description><![CDATA[<p>Wie kommt es, daß du den Eingabe-Operator &gt;&gt; verwendest (und zu verstehen scheinst), aber den gegenteiligen Ausgabe-Operator &lt;&lt; nicht?</p>
<p>Stichwort: Überladung von I/O Stream Operatoren, s. z.B. <a href="http://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/" rel="nofollow">Overloading the I/O operators</a></p>
<p>PS: Im Thread <a href="https://www.c-plusplus.net/forum/339955">Ausgabe von Objekten mittels for-Schleife und Methoden</a> gibt es auch eine Erklärung zum &lt;&lt;-Operator (von &quot;HarteWare&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511193</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Tue, 11 Oct 2016 08:40:31 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Tue, 11 Oct 2016 12:18:46 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>Wie kommt es, daß du den Eingabe-Operator &gt;&gt; verwendest (und zu verstehen scheinst), aber den gegenteiligen Ausgabe-Operator &lt;&lt; nicht?</p>
</blockquote>
<p>Weil ich den dato lediglich analog definiert habe. Ich bin eher jemand, bei dem das Verständnis mit dem Ausprobieren kommt. Aber an den Punkt gelange ich bzgl. diesen streams bislang nicht (da man da im Vorfeld scheinbar doch mehr verstanden haben muss ^^). Ohne Klasse u.ä. lediglich Dateien einzulesen usw. ist klar, aber da kommt man ja auch ohne den &lt;&lt;operator aus.</p>
<p>Th69 schrieb:</p>
<blockquote>
<p>Stichwort: Überladung von I/O Stream Operatoren, s. z.B. <a href="http://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/" rel="nofollow">Overloading the I/O operators</a></p>
<p>PS: Im Thread <a href="https://www.c-plusplus.net/forum/339955">Ausgabe von Objekten mittels for-Schleife und Methoden</a> gibt es auch eine Erklärung zum &lt;&lt;-Operator (von &quot;HarteWare&quot;).</p>
</blockquote>
<p>Danke für die Links! Das hat mir vom Verständnis schonmal geholfen, ich probiere das mal umzusetzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511225</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Tue, 11 Oct 2016 12:18:46 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Fri, 14 Oct 2016 10:01:08 GMT]]></title><description><![CDATA[<p>So, habe jetzt alles und es funktioniert sogar.<br />
Verstehe es aber trotzdem nicht <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="😃"
    /> <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>
<p>Ich habe Folgendes:</p>
<p><a href="//main.cpp">//main.cpp</a></p>
<pre><code>#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;limits&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &quot;APD.h&quot;

using namespace std;

int main(int argc,char *argv[])
{   
const char *INPUTFILE=&quot;Test.txt&quot;; 
ifstream input(INPUTFILE);
APD apd(input);
apd.print();
}
</code></pre>
<p><a href="//APD.h">//APD.h</a></p>
<pre><code>#ifndef APD_H
#define APD_H
#include &lt;iostream&gt;

class APD
{
	private:
		int m_SN;
		double m_temperature;
		int m_rad;
		int m_grid;
		int m_grid_pos;
		double m_M;
		double m_UBias;
		double m_Id;
		double m_dM;

	public:
		ostream&amp; operator&lt;&lt;(ostream&amp; out);	
		friend istream&amp; operator&gt;&gt; (istream&amp; in, APD&amp; apd);						

		APD();	
		APD(ifstream&amp; input);										

		~APD();	
};
#endif
</code></pre>
<p><a href="//APD.cpp">//APD.cpp</a></p>
<pre><code>#include &lt;string&gt;
#include &lt;limits&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &quot;APD.h&quot;

using namespace std;

	APD::APD()
	{
		m_SN=0.; 
		m_temperature=0; 
		m_rad=0.; 
		m_grid=0.; 
		m_grid_pos=0.; 
		m_M=0; 
		m_UBias=0; 
		m_Id=0; 
		m_dM=0;
	}

	APD::~APD(){}	

	APD::APD(ifstream&amp; input)										
	{
		while(!input.eof()) 
		{			
			if(isdigit(input.peek()))							
			{
				break;					
			}		
			else input.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');			
		}
		input &gt;&gt; m_SN &gt;&gt; m_temperature &gt;&gt; m_rad &gt;&gt; m_grid &gt;&gt; m_grid_pos &gt;&gt; m_M &gt;&gt; m_UBias &gt;&gt; m_Id &gt;&gt; m_dM;
	}

	istream&amp; operator&gt;&gt; (istream&amp; in, APD&amp; apd)		
	{     
		while(in) 
		{			
			if(isdigit(in.peek()))								
			{
				break;					
			}		
			else in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');			
		}
		in &gt;&gt; apd.m_SN &gt;&gt; apd.m_temperature &gt;&gt; apd.m_rad &gt;&gt; apd.m_grid &gt;&gt; apd.m_grid_pos &gt;&gt; apd.m_M &gt;&gt; apd.m_UBias &gt;&gt; apd.m_Id &gt;&gt; apd.m_dM;	
		return in;
	}

	ostream&amp; APD::operator&lt;&lt;(ostream&amp; out) 							
	{     
		out &lt;&lt; m_SN &lt;&lt; m_temperature &lt;&lt; m_rad &lt;&lt; m_grid &lt;&lt; m_grid_pos &lt;&lt; m_M &lt;&lt; m_UBias &lt;&lt; m_Id &lt;&lt; m_dM;	
		return out;
	}						

	void APD::print() const
	{
		cout&lt;&lt;&quot;*************************************&quot;&lt;&lt;endl;
		cout&lt;&lt;&quot;SN	: &quot;&lt;&lt;m_SN&lt;&lt;endl;
		cout&lt;&lt;&quot;Grid	: &quot;&lt;&lt;m_grid&lt;&lt;endl;
		cout&lt;&lt;&quot;Grid Pos	: &quot;&lt;&lt;m_grid_pos&lt;&lt;endl;
		cout&lt;&lt;&quot;*************************************&quot;&lt;&lt;endl;
	}
</code></pre>
<p>Ich verstehe nicht, wofür ich <em>ostream&amp; operator&lt;&lt;(ostream&amp; out)</em> und <em>friend istream&amp; operator&gt;&gt; (istream&amp; in, APD&amp; apd)</em> benötige.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511535</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Fri, 14 Oct 2016 10:01:08 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Fri, 14 Oct 2016 11:18:39 GMT]]></title><description><![CDATA[<p>Progressive schrieb:</p>
<blockquote>
<p>So, habe jetzt alles und es funktioniert sogar.<br />
Verstehe es aber trotzdem nicht <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="😃"
    /> <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>
<p>[...]</p>
<p>Ich verstehe nicht, wofür ich <em>ostream&amp; operator&lt;&lt;(ostream&amp; out)</em> und <em>friend istream&amp; operator&gt;&gt; (istream&amp; in, APD&amp; apd)</em> benötige.</p>
</blockquote>
<p>Also: Deine print-Funktion gibt immer auf der Standardausgabe Daten aus ( <code>cout &lt;&lt; ...</code> ). Normalerweise möchte man sowas allgemein halten, dass man auch zum Beispiel in eine Datei schreiben könnte. Du kannst deinem print also einen Parameter vom Typ ostream&amp; spendieren und statt cout den übergebenen Stream verwenden.</p>
<p>Den opereator&lt;&lt; brauchst du, damit du in deinem Hauptprogramm sowas schreiben kannst:</p>
<pre><code>APD apd(input);
// statt: apd.print();
std::cout &lt;&lt; apd &lt;&lt; '\n';
</code></pre>
<p>Dazu definiere den operator&lt;&lt; analog zu operator&gt;&gt;, also NICHT so wie du es gemacht hast, sondern definiere ihn analog AUSSERHALB der Klasse und gib ihm ostream&amp; und const APD&amp; als Parameter. Darin schreibst du dann mit &lt;&lt; auf den ostream, den du am Ende returnst. Oder besser, rufe in dem operator&lt;&lt; einfach apd.print(os) auf, nachdem du dem print das ostream-Argument hinzugefügt hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511539</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Fri, 14 Oct 2016 11:18:39 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Fri, 14 Oct 2016 13:04:14 GMT]]></title><description><![CDATA[<p>Ok, danke!<br />
Warum soll ich die &lt;&lt;,&gt;&gt; Operatoren denn außerhalb der Klasse definieren bzw. wo denn ? In main ?</p>
<p>Mit analog meinst du:</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; out, const APD&amp;);	
istream&amp; operator&gt;&gt;(istream&amp; in, const APD&amp;);
</code></pre>
<p>oder</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; out, APD&amp; apd);	
istream&amp; operator&gt;&gt;(istream&amp; in, APD&amp; apd);
</code></pre>
<p>?</p>
<p>Ich verstehe den zweiten Parameter irgendwie nicht. Was bedeutet &quot;APD&amp;&quot; und was &quot;APD&amp; apd&quot; ? Ich stehe da echt auf dem Schlauch, dabei habe ich schon einiges gelesen.. <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/2511548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511548</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Fri, 14 Oct 2016 13:04:14 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Fri, 14 Oct 2016 15:14:29 GMT]]></title><description><![CDATA[<p>Progressive schrieb:</p>
<blockquote>
<p>Ok, danke!<br />
Warum soll ich die &lt;&lt;,&gt;&gt; Operatoren denn außerhalb der Klasse definieren bzw. wo denn ?</p>
</blockquote>
<p>Du sollst das für &lt;&lt; genauso machen wie &gt;&gt; (das schrieb ich doch)!</p>
<p>Guck doch mal, was du geschrieben hast in der cpp-Datei:</p>
<pre><code>istream&amp; operator&gt;&gt; (istream&amp; in, APD&amp; apd)
ostream&amp; APD::operator&lt;&lt;(ostream&amp; out)
</code></pre>
<p>Fällt dir da ein Unterschied auf? &lt;&lt; ist in der Klasse, &gt;&gt; ist nicht in der Klasse. Im Header hast du einmal den &gt;&gt; als Friend markiert. Wenn du über print gehst, brauchst du &lt;&lt; nicht einmal als friend markieren.</p>
<p>Die Signatur von &lt;&lt; sollte so sein:</p>
<pre><code>ostream&amp; APD::operator&lt;&lt;(ostream&amp; out, const APD&amp; apd)
</code></pre>
<blockquote>
<p>Mit analog meinst du:</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; out, const APD&amp;);	
istream&amp; operator&gt;&gt;(istream&amp; in, const APD&amp;);
</code></pre>
<p>oder</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; out, APD&amp; apd);	
istream&amp; operator&gt;&gt;(istream&amp; in, APD&amp; apd);
</code></pre>
</blockquote>
<p>Natürlich die Version mit const! Du willst doch nicht, dass eine Ausgabe das Objekt ändern kann.</p>
<blockquote>
<p>Ich verstehe den zweiten Parameter irgendwie nicht. Was bedeutet &quot;APD&amp;&quot; und was &quot;APD&amp; apd&quot; ?</p>
</blockquote>
<p>Das ist doch dieselbe Signatur. Einmal vergibst du einen Namen, einmal nicht.<br />
APD&amp;: es wird ein Parameter vom Typ Referenz auf APD übergeben. Ein Name wird noch nicht vergeben.<br />
APD&amp; apd: es wird ein Parameter vom Typ Referenz auf APD übergeben, welcher den Namen &quot;apd&quot; hat (wenn du keinen Namen vergibst, kannst du den Wert nicht benutzen - aber wenn du nur die Funktion deklarierst aber nicht definierst, brauchst du den Namen noch nicht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511559</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Fri, 14 Oct 2016 15:14:29 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Fri, 14 Oct 2016 15:16:04 GMT]]></title><description><![CDATA[<p>Ich schrieb mist:</p>
<blockquote>
<pre><code>ostream&amp; APD::operator&lt;&lt;(ostream&amp; out, const APD&amp; apd)
</code></pre>
</blockquote>
<p>meinte natürlich:</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; out, const APD&amp; apd)
</code></pre>
<p>Ohne das APD::</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511560</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Fri, 14 Oct 2016 15:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Fri, 14 Oct 2016 16:05:38 GMT]]></title><description><![CDATA[<p>wob schrieb:</p>
<blockquote>
<p>Das ist doch dieselbe Signatur. Einmal vergibst du einen Namen, einmal nicht.<br />
APD&amp;: es wird ein Parameter vom Typ Referenz auf APD übergeben. Ein Name wird noch nicht vergeben.<br />
APD&amp; apd: es wird ein Parameter vom Typ Referenz auf APD übergeben, welcher den Namen &quot;apd&quot; hat (wenn du keinen Namen vergibst, kannst du den Wert nicht benutzen - aber wenn du nur die Funktion deklarierst aber nicht definierst, brauchst du den Namen noch nicht).</p>
</blockquote>
<p>Erstmal vielen Dank für die Ausführlichkeit!<br />
Ich kann mir irgendwie nach wie vor nicht vorstellen, was da vor sich geht. Was bewirkt es, wenn ein Parameter vom Typ Referenz auf die Klasse (?) APD übergeht ? Wo wird das dann umgesetzt, wie verwendet,.. ? Was in der Klasse bekommt diesen Parameter ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511572</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Fri, 14 Oct 2016 16:05:38 GMT</pubDate></item><item><title><![CDATA[Reply to wie funktioniert equal() on Fri, 14 Oct 2016 16:13:16 GMT]]></title><description><![CDATA[<p>Also wenn ich</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; out, const APD&amp;);
</code></pre>
<p>außerhalb der Klasse definiere, ist das ok, innerhalb mag er nicht <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>Ich check's nicht.. woher weiß &gt;&gt; überhaupt, wo die Daten (also in dem Fall die Datei) herkommen ??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511573</guid><dc:creator><![CDATA[Progressive]]></dc:creator><pubDate>Fri, 14 Oct 2016 16:13:16 GMT</pubDate></item></channel></rss>