<?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[Dateistatistik (Uebung aus einem Buch) - Wo ist der Fehler?]]></title><description><![CDATA[<p>Hallo,<br />
in dem Buch, dass ich zurzeit durcharbeite (von Ulrich Breymann, &quot;C++ - Eonfuehrung und professionelle Programmierung&quot;) gibt es eine Aufgabe bei der es darum geht, die Statistik einer Datei zu ermitteln (Anzahl der Zeichen, der Worte und der Zeilen).<br />
Das hab ich dann auch gemacht - wie ich dann aber feststellen musste ist diese Aufgabe von Ulrich Breymann etwas anders geloest worden. Doch finde ich meinen Loesungsansatz eigtl. nicht schlecht.<br />
Ich habe nur ein Problem bei der Sache... Das 'neue Zeile'-Zeichen wird auch als Zeichen dazugezaehlt, trotz der Anweisung if(zeichen != '\n') anzahlzeichen++;<br />
Woran liegt denn das?</p>
<p>Meine Testdatei hat folgenden Inhalt:</p>
<pre><code>aaa aaa
aaa
</code></pre>
<p>(inklusive einer &quot;Leerzeile&quot; zum Schluss)<br />
Das Ergebnis muesste dann wie folgt lauten:</p>
<pre><code>Anzahl der Zeichen: 10
Anzahl der Worte: 3
Anzahl der Zeilen: 3
</code></pre>
<p>Stattdessen zeigt er mir aber bei 'Anzahl der Zeichen' 12 an. Daher nehme ich an, dass die 'neue Zeile'-Zeichen dazugezaaehlt werden - und WARUM das so ist verstehe ich nicht...<br />
Hier der Code (die kritische Zeile habe ich mit einem Kommentar versehen):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

int main()
{
	string filename;
	char zeichen, vorherzeichen;
	vorherzeichen = ' ';
	int anzahlzeichen = 0, anzahlworte = 0, anzahlzeilen = 1;
	vector&lt;char&gt; inhalt;
	ifstream fObj;

	cout &lt;&lt; &quot;Bitte Name der Datei eingeben: &quot;;
	getline(cin, filename);

	fObj.open(filename.c_str(), ios::binary | ios::in);

	if(!fObj)
	{
		cout &lt;&lt; &quot;\n\nEs ist ein Fehler beim Lesen der Datei aufgetreten!&quot;;
		cout &lt;&lt; &quot;\nBitte ENTER druecken, um das Programm zu beenden ...&quot;;
		getline(cin, filename);
		return -1;
	}
	else
	{
		while(fObj.get(zeichen))
		{
			inhalt.push_back(zeichen);

			if(zeichen != '\n' &amp;&amp; zeichen != ' ' &amp;&amp; (vorherzeichen == '\n' || vorherzeichen == ' '))
				anzahlworte++;

			if(zeichen == '\n')
				anzahlzeilen++;

			if(zeichen != '\n')		// Zaehle eine neue Zeile NICHT als Zeichen
									// funktioniert nicht
				anzahlzeichen++;

			vorherzeichen = zeichen;
		}

		cout &lt;&lt; &quot;\n\nAnzahl an Zeichen: &quot; &lt;&lt; anzahlzeichen &lt;&lt; endl;
		cout &lt;&lt; &quot;Anzahl an Worten: &quot; &lt;&lt; anzahlworte &lt;&lt; endl;
		cout &lt;&lt; &quot;Anzahl an Zeilen: &quot; &lt;&lt; anzahlzeilen &lt;&lt; endl;

		cout &lt;&lt; &quot;\nMoechten Sie den kompletten Dateiinhalt wiedergeben(j/n)? &quot;;
		cin.get(zeichen);

		if(zeichen == 'j' || zeichen == 'J')
		{
			cout &lt;&lt; endl &lt;&lt; endl;
			cout &lt;&lt; &quot;DATEIINHALT&quot; &lt;&lt; endl;
			cout &lt;&lt; &quot;***********&quot; &lt;&lt; endl &lt;&lt; endl;

			for(int i=0; i&lt;inhalt.size(); i++)
				cout &lt;&lt; inhalt[i];

			cout &lt;&lt; endl;
		}

		fObj.close();
		fObj.clear();
	}

	string temp;
	cout &lt;&lt; &quot;\n\nBitte ENTER druecken, um das Programm zu beenden ...&quot;;
	getline(cin, temp);

	return 0;
}
</code></pre>
<p>Kann mir jemand helfen?<br />
Suche schon die ganze Zeit verzweifelt nach dem Fehler <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>
<p>Gruss,<br />
Cartman</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/231746/dateistatistik-uebung-aus-einem-buch-wo-ist-der-fehler</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 18:50:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/231746.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Jan 2009 15:52:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dateistatistik (Uebung aus einem Buch) - Wo ist der Fehler? on Wed, 14 Jan 2009 15:52:56 GMT]]></title><description><![CDATA[<p>Hallo,<br />
in dem Buch, dass ich zurzeit durcharbeite (von Ulrich Breymann, &quot;C++ - Eonfuehrung und professionelle Programmierung&quot;) gibt es eine Aufgabe bei der es darum geht, die Statistik einer Datei zu ermitteln (Anzahl der Zeichen, der Worte und der Zeilen).<br />
Das hab ich dann auch gemacht - wie ich dann aber feststellen musste ist diese Aufgabe von Ulrich Breymann etwas anders geloest worden. Doch finde ich meinen Loesungsansatz eigtl. nicht schlecht.<br />
Ich habe nur ein Problem bei der Sache... Das 'neue Zeile'-Zeichen wird auch als Zeichen dazugezaehlt, trotz der Anweisung if(zeichen != '\n') anzahlzeichen++;<br />
Woran liegt denn das?</p>
<p>Meine Testdatei hat folgenden Inhalt:</p>
<pre><code>aaa aaa
aaa
</code></pre>
<p>(inklusive einer &quot;Leerzeile&quot; zum Schluss)<br />
Das Ergebnis muesste dann wie folgt lauten:</p>
<pre><code>Anzahl der Zeichen: 10
Anzahl der Worte: 3
Anzahl der Zeilen: 3
</code></pre>
<p>Stattdessen zeigt er mir aber bei 'Anzahl der Zeichen' 12 an. Daher nehme ich an, dass die 'neue Zeile'-Zeichen dazugezaaehlt werden - und WARUM das so ist verstehe ich nicht...<br />
Hier der Code (die kritische Zeile habe ich mit einem Kommentar versehen):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

int main()
{
	string filename;
	char zeichen, vorherzeichen;
	vorherzeichen = ' ';
	int anzahlzeichen = 0, anzahlworte = 0, anzahlzeilen = 1;
	vector&lt;char&gt; inhalt;
	ifstream fObj;

	cout &lt;&lt; &quot;Bitte Name der Datei eingeben: &quot;;
	getline(cin, filename);

	fObj.open(filename.c_str(), ios::binary | ios::in);

	if(!fObj)
	{
		cout &lt;&lt; &quot;\n\nEs ist ein Fehler beim Lesen der Datei aufgetreten!&quot;;
		cout &lt;&lt; &quot;\nBitte ENTER druecken, um das Programm zu beenden ...&quot;;
		getline(cin, filename);
		return -1;
	}
	else
	{
		while(fObj.get(zeichen))
		{
			inhalt.push_back(zeichen);

			if(zeichen != '\n' &amp;&amp; zeichen != ' ' &amp;&amp; (vorherzeichen == '\n' || vorherzeichen == ' '))
				anzahlworte++;

			if(zeichen == '\n')
				anzahlzeilen++;

			if(zeichen != '\n')		// Zaehle eine neue Zeile NICHT als Zeichen
									// funktioniert nicht
				anzahlzeichen++;

			vorherzeichen = zeichen;
		}

		cout &lt;&lt; &quot;\n\nAnzahl an Zeichen: &quot; &lt;&lt; anzahlzeichen &lt;&lt; endl;
		cout &lt;&lt; &quot;Anzahl an Worten: &quot; &lt;&lt; anzahlworte &lt;&lt; endl;
		cout &lt;&lt; &quot;Anzahl an Zeilen: &quot; &lt;&lt; anzahlzeilen &lt;&lt; endl;

		cout &lt;&lt; &quot;\nMoechten Sie den kompletten Dateiinhalt wiedergeben(j/n)? &quot;;
		cin.get(zeichen);

		if(zeichen == 'j' || zeichen == 'J')
		{
			cout &lt;&lt; endl &lt;&lt; endl;
			cout &lt;&lt; &quot;DATEIINHALT&quot; &lt;&lt; endl;
			cout &lt;&lt; &quot;***********&quot; &lt;&lt; endl &lt;&lt; endl;

			for(int i=0; i&lt;inhalt.size(); i++)
				cout &lt;&lt; inhalt[i];

			cout &lt;&lt; endl;
		}

		fObj.close();
		fObj.clear();
	}

	string temp;
	cout &lt;&lt; &quot;\n\nBitte ENTER druecken, um das Programm zu beenden ...&quot;;
	getline(cin, temp);

	return 0;
}
</code></pre>
<p>Kann mir jemand helfen?<br />
Suche schon die ganze Zeit verzweifelt nach dem Fehler <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>
<p>Gruss,<br />
Cartman</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645495</guid><dc:creator><![CDATA[Eric Cartman]]></dc:creator><pubDate>Wed, 14 Jan 2009 15:52:56 GMT</pubDate></item><item><title><![CDATA[Reply to Dateistatistik (Uebung aus einem Buch) - Wo ist der Fehler? on Wed, 14 Jan 2009 15:58:44 GMT]]></title><description><![CDATA[<p>Vielleicht ist bei dir der Zeilenumbruch nicht nur &quot;\n&quot;, sondern &quot;\r\n&quot;.</p>
<p>Lies doch die einzelnen Zeilen mit <code>std::getline()</code> in einen String und zähle dort weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645501</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 14 Jan 2009 15:58:44 GMT</pubDate></item><item><title><![CDATA[Reply to Dateistatistik (Uebung aus einem Buch) - Wo ist der Fehler? on Wed, 14 Jan 2009 16:09:34 GMT]]></title><description><![CDATA[<p>Hm, du hast Recht.</p>
<p>Wobei ich das komisch finde.</p>
<p>Im Buch steht 'Der Schalter ios::binary verhindert, dass Zeilenendkennung \n in CR/LF umgewandelt wird' - dies scheint aber offensichtlich nicht der Fall zu sein...</p>
<p>Denn mit folgendem Code:</p>
<pre><code class="language-cpp">if(zeichen != '\n' &amp;&amp; zeichen!= '\r')
</code></pre>
<p>funktioniert das Programm...</p>
<p>danke fuer deine Hilfe - aber merkwuerdig find ich das schon... wozu soll das 'ios::binary' denn dann noch gut sein?</p>
<p>Gruss,<br />
Cartman</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645514</guid><dc:creator><![CDATA[Eric Cartman]]></dc:creator><pubDate>Wed, 14 Jan 2009 16:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to Dateistatistik (Uebung aus einem Buch) - Wo ist der Fehler? on Wed, 14 Jan 2009 16:12:03 GMT]]></title><description><![CDATA[<p>Das bedeutet, dass du binär einliest und nicht als Text.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645515</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 14 Jan 2009 16:12:03 GMT</pubDate></item></channel></rss>