<?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[Ifstream -&amp;gt; Ende der Datei in nächster Zeile?]]></title><description><![CDATA[<p>Der Titel sagt wohl schon das meiste.</p>
<p>Ich will ein Programm schreiben, welches mir eine 2-spaltige txt-Datei einließt und den Mittelwert der 2. Spalte bildet.<br />
Das Problem welches ich noch lösen will ist folgendes:<br />
Ich verwende if-Stream und will mit eof() prüfen ob ich das Ende der Datei erreicht habe. Das Problem ist nun aber, dass der stream immer einen Wert zu viel ausließt. Er läuft also noch einen schleifendurchlauf zu viel durch und gibt mir den letzten Wert doppelt zurück (der ja in tmp gespeichert ist.)</p>
<p>Hier mein Code:</p>
<pre><code>float average(string filename, int row){

	ifstream in(const_cast&lt;char*&gt;(filename.c_str()) );
	int tmp;
	int N = 0;
	float sum = 0;
	float average = 0;

	while( !(in &gt;&gt; tmp) ) {
		in.clear();
		in.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n');
  }
	in.unget();

	for( int i = 0; !(in.eof()); i++ ){
		for( int j = 1; j &lt; 3; j++ ){			
			in &gt;&gt; tmp;
			if( j == row ){
				cout &lt;&lt; tmp &lt;&lt; endl;
				sum+=tmp;
				N++;
			}
		}
	}

	average = sum/N;
	cout &lt;&lt; &quot;The sum is &quot; &lt;&lt; sum &lt;&lt; endl;
	cout &lt;&lt; &quot;The average of the &quot; &lt;&lt; N &lt;&lt; &quot; datapoints is: &quot; &lt;&lt; average &lt;&lt; endl;
	cout &lt;&lt; &quot;_________________&quot; &lt;&lt; endl;

	return average;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/309975/ifstream-gt-ende-der-datei-in-nächster-zeile</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 00:08:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309975.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 31 Oct 2012 17:40:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ifstream -&amp;gt; Ende der Datei in nächster Zeile? on Wed, 31 Oct 2012 17:40:26 GMT]]></title><description><![CDATA[<p>Der Titel sagt wohl schon das meiste.</p>
<p>Ich will ein Programm schreiben, welches mir eine 2-spaltige txt-Datei einließt und den Mittelwert der 2. Spalte bildet.<br />
Das Problem welches ich noch lösen will ist folgendes:<br />
Ich verwende if-Stream und will mit eof() prüfen ob ich das Ende der Datei erreicht habe. Das Problem ist nun aber, dass der stream immer einen Wert zu viel ausließt. Er läuft also noch einen schleifendurchlauf zu viel durch und gibt mir den letzten Wert doppelt zurück (der ja in tmp gespeichert ist.)</p>
<p>Hier mein Code:</p>
<pre><code>float average(string filename, int row){

	ifstream in(const_cast&lt;char*&gt;(filename.c_str()) );
	int tmp;
	int N = 0;
	float sum = 0;
	float average = 0;

	while( !(in &gt;&gt; tmp) ) {
		in.clear();
		in.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n');
  }
	in.unget();

	for( int i = 0; !(in.eof()); i++ ){
		for( int j = 1; j &lt; 3; j++ ){			
			in &gt;&gt; tmp;
			if( j == row ){
				cout &lt;&lt; tmp &lt;&lt; endl;
				sum+=tmp;
				N++;
			}
		}
	}

	average = sum/N;
	cout &lt;&lt; &quot;The sum is &quot; &lt;&lt; sum &lt;&lt; endl;
	cout &lt;&lt; &quot;The average of the &quot; &lt;&lt; N &lt;&lt; &quot; datapoints is: &quot; &lt;&lt; average &lt;&lt; endl;
	cout &lt;&lt; &quot;_________________&quot; &lt;&lt; endl;

	return average;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2266037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266037</guid><dc:creator><![CDATA[Tom_12345]]></dc:creator><pubDate>Wed, 31 Oct 2012 17:40:26 GMT</pubDate></item><item><title><![CDATA[Reply to Ifstream -&amp;gt; Ende der Datei in nächster Zeile? on Wed, 31 Oct 2012 18:14:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">ifstream in(const_cast&lt;char*&gt;(filename.c_str()) ); //Zeile 3
</code></pre>
<p>Wieso zum Teufel castest du?<br />
(P.S.: Seit C++11 kann man auch direkt 'nen <code>string</code> übergeben)</p>
<p>Wie ist die Datei aufgebaut?<br />
So?</p>
<pre><code>0   8
2   9
684 654
5   1.4
6   ....
16
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2266047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266047</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 31 Oct 2012 18:14:21 GMT</pubDate></item><item><title><![CDATA[Reply to Ifstream -&amp;gt; Ende der Datei in nächster Zeile? on Thu, 01 Nov 2012 07:55:47 GMT]]></title><description><![CDATA[<p>Die Konstruktion</p>
<pre><code class="language-cpp">while( !EOF ) {
        in &gt;&gt; irgendwas;
        // mache was mit 'irgendwas'
</code></pre>
<p>.. ist <a href="http://www.c-plusplus.net/forum/p2042572#2042572" rel="nofollow">derart verbreitet</a> - ich habe sie auch schon in Lehrbüchern gesehen, dass sie viele unbedacht übernehmen.<br />
Trotzdem ist sie fehlerhaft und führt u.a. zu dem von Tom_12345 beschriebenen Verhalten.</p>
<p>Besser:<br />
- Lese ein was auch immer Du willst<br />
- prüfe danach(!), ob das gut gegangen ist</p>
<p>in diesem Fall in etwa so:</p>
<pre><code class="language-cpp">float average(string filename, int row) 
{
    ifstream in( filename.c_str() );
    int tmp;
    while( !(in &gt;&gt; tmp) ) { 
        in.clear();
        in.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n');
    }
    in.unget(); // das Verfahren funktioniert nicht, wenn row==1 und tmp &gt;9 ist

    int N = 0;
    float sum = 0;
    for( float tmp1, tmp2; in &gt;&gt; tmp1 &gt;&gt; tmp2; ++N )
    {
        if( row == 1 ) 
            sum += tmp1;
        else if( row == 2 ) 
            sum += tmp2;
    }

    float average = sum/N;
    cout &lt;&lt; &quot;The sum is &quot; &lt;&lt; sum &lt;&lt; endl;
    cout &lt;&lt; &quot;The average of the &quot; &lt;&lt; N &lt;&lt; &quot; datapoints is: &quot; &lt;&lt; average &lt;&lt; endl;
    cout &lt;&lt; &quot;_________________&quot; &lt;&lt; endl;

    return average;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2266129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266129</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 01 Nov 2012 07:55:47 GMT</pubDate></item><item><title><![CDATA[Reply to Ifstream -&amp;gt; Ende der Datei in nächster Zeile? on Thu, 01 Nov 2012 09:28:29 GMT]]></title><description><![CDATA[<p>Danke für die Antowrt Werner Solomon, damit hat sich mein Problem geklärt.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28547">@Sone</a><br />
Wenn ich nur den String filename übergebe, ohne den cast, bekomme ich für diese Zeile den Fehler</p>
<pre><code>no matching function for call to ‘std::basic_ofstream&lt;char&gt;::basic_ofstream(std::string&amp;)’
</code></pre>
<p>.</p>
<p>Was müsste ich denn verändern, damit ich dem Konstruktor mit ohne einen cast aufrufen kann? z.B.<br />
ofstream out(file_out); wobei file_out ein String ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266144</guid><dc:creator><![CDATA[Tom_12345]]></dc:creator><pubDate>Thu, 01 Nov 2012 09:28:29 GMT</pubDate></item><item><title><![CDATA[Reply to Ifstream -&amp;gt; Ende der Datei in nächster Zeile? on Thu, 01 Nov 2012 10:22:54 GMT]]></title><description><![CDATA[<p>Tom_12345 schrieb:</p>
<blockquote>
<p>ofstream out(file_out); wobei file_out ein String ist.</p>
</blockquote>
<p><code>ofstream out(file_out.c_str());</code> oder den C++11-Standard benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266157</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 01 Nov 2012 10:22:54 GMT</pubDate></item><item><title><![CDATA[Reply to Ifstream -&amp;gt; Ende der Datei in nächster Zeile? on Thu, 01 Nov 2012 15:15:34 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Tom_12345 schrieb:</p>
<blockquote>
<p>ofstream out(file_out); wobei file_out ein String ist.</p>
</blockquote>
<p><code>ofstream out(file_out.c_str());</code> oder den C++11-Standard benutzen.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Das <code>const_cast</code> ist einfach total überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266251</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 01 Nov 2012 15:15:34 GMT</pubDate></item></channel></rss>