<?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[Eingaben lesen]]></title><description><![CDATA[<p>Hallo,<br />
In meinem Buch gabs die Aufgabe ein Programm zum fehlertoleranten Einlesen zu schreiben.<br />
Es sollte einfach nur auf Eingaben warten und wenn eine kein Int-Wert ist, sollte ein Fehler ausgegeben werden.<br />
Danach sollte jedoch weiter eingelesen werden.<br />
Eigentlich müsste das folgende Programm ja funktionieren- doch sobald ich eine falsche Eingabe mache geht der Compiler in eine endlosschleife, welche unendlich oft &quot;BAD DATA&quot; ausgibt:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;fstream&gt;
#include &lt;stdexcept&gt;
using namespace std;
int main(void)
{
   int ival;
   while(cin &gt;&gt; ival, !cin.eof())
   {
      if(cin.fail())
      {
         cerr &lt;&lt; &quot;BAD DATA&quot;;
         cin.clear(istream::failbit);
         continue;   
      }                
   }    
}
</code></pre>
<p>Irgendwas ist da ncoh falsch...-.-</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/196090/eingaben-lesen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 10:07:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/196090.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Oct 2007 11:03:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eingaben lesen on Thu, 25 Oct 2007 11:04:35 GMT]]></title><description><![CDATA[<p>Hallo,<br />
In meinem Buch gabs die Aufgabe ein Programm zum fehlertoleranten Einlesen zu schreiben.<br />
Es sollte einfach nur auf Eingaben warten und wenn eine kein Int-Wert ist, sollte ein Fehler ausgegeben werden.<br />
Danach sollte jedoch weiter eingelesen werden.<br />
Eigentlich müsste das folgende Programm ja funktionieren- doch sobald ich eine falsche Eingabe mache geht der Compiler in eine endlosschleife, welche unendlich oft &quot;BAD DATA&quot; ausgibt:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;fstream&gt;
#include &lt;stdexcept&gt;
using namespace std;
int main(void)
{
   int ival;
   while(cin &gt;&gt; ival, !cin.eof())
   {
      if(cin.fail())
      {
         cerr &lt;&lt; &quot;BAD DATA&quot;;
         cin.clear(istream::failbit);
         continue;   
      }                
   }    
}
</code></pre>
<p>Irgendwas ist da ncoh falsch...-.-</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391755</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Thu, 25 Oct 2007 11:04:35 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Thu, 25 Oct 2007 11:09:31 GMT]]></title><description><![CDATA[<p>Nach einem Fehlversuch bleiben die ungültigen Eingabedaten noch im Stream-Puffer stehen - die mußt du manuell entsorgen, wenn du sie nicht benötigst (ignore() dürfte am einfachsten sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391757</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 25 Oct 2007 11:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Thu, 25 Oct 2007 11:13:22 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Du musst das &quot;nicht richtig Interpretierbare&quot; auch aus cin &quot;löschen&quot;. So liest er immer wieder dasselbe Token. =&gt; cin.ignore()</p>
<p>&quot;continue&quot; ist in diesem Beispiel natürlich überflüssig, aber vermutlich kommt bei Dir nach dem if-Block noch eine Verarbeitung, die Du damit überspringen möchtest (auch da würde ich kein continue machen, aber das ist wohl Geschmaxache).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391761</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 25 Oct 2007 11:13:22 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Thu, 25 Oct 2007 13:12:37 GMT]]></title><description><![CDATA[<p>Danke!<br />
Werds mal ausprobieren, wenn mein PC wieder geht- meine Festplatte ist nämlich soeben abgefreckelt^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391879</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Thu, 25 Oct 2007 13:12:37 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Thu, 25 Oct 2007 13:17:41 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>Danke!<br />
Werds mal ausprobieren, wenn mein PC wieder geht- meine Festplatte ist nämlich soeben abgefreckelt^^</p>
</blockquote>
<p>Wie kam's? Hast du die Bedeutung von &quot;undefined behaviour&quot; unterschätzt <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="😃"
    /> *scnr*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391882</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 25 Oct 2007 13:17:41 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Thu, 25 Oct 2007 13:48:31 GMT]]></title><description><![CDATA[<p>So in der Richtung.... <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="😃"
    /></p>
<p>Geht aber leider immer noch nicht so:</p>
<pre><code>#include &lt;iostream&gt; 
#include &lt;sstream&gt; 
#include &lt;fstream&gt; 
#include &lt;stdexcept&gt; 
using namespace std; 
int main(void) 
{ 
   int ival; 
   while(cin &gt;&gt; ival, !cin.eof()) 
   { 
      if(cin.fail()) 
      { 
         cerr &lt;&lt; &quot;BAD DATA&quot;; 
         cin.clear(istream::failbit); 
         cin.ignore();
         continue; 
      }                 
   }     
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1391916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391916</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Thu, 25 Oct 2007 13:48:31 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Thu, 25 Oct 2007 13:52:38 GMT]]></title><description><![CDATA[<p>777 schrieb:</p>
<blockquote>
<p>Geht aber leider immer noch nicht so:</p>
<pre><code>#include &lt;iostream&gt; 
#include &lt;sstream&gt; 
#include &lt;fstream&gt; 
#include &lt;stdexcept&gt; 
using namespace std; 
int main(void) 
{ 
   int ival; 
   while(cin &gt;&gt; ival, !cin.eof()) 
   { 
      if(cin.fail()) 
      { 
         cerr &lt;&lt; &quot;BAD DATA&quot;; 
         cin.clear(istream::failbit); 
         cin.ignore();
         continue; 
      }                 
   }     
}
</code></pre>
</blockquote>
<p>Hmm, sollte aber eigentlich passen.</p>
<p>Wobei, ignore() ohne weitere Parameter verwirft genau ein Zeichen der Eingabe - d.h. wenn du viel Müll eingegeben hast, bekommst du entsprechend viele &quot;BAD DATA&quot; Meldungen. Versuch' mal, einen etwas größeren Abschnitt zu verwerfen: <code>cin.ignore(numeric_limits&lt;size_t&gt;::max(),'\n');</code> (braucht noch ein '#include &lt;limits&gt;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391918</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 25 Oct 2007 13:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Thu, 25 Oct 2007 18:28:41 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt; // std::cin, std::cerr, std::cout
#include &lt;limits&gt; // std::numeric_limits

int main(void)
{
   int ival(0);
   while (!(std::cin &gt;&gt; ival))
   {
       std::cerr &lt;&lt; &quot;[invalid data]&quot; &lt;&lt; std::endl;
       std::cin.clear();
       std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
   }  
   std::cout &lt;&lt; &quot;\&quot;ival\&quot; = &quot; &lt;&lt; ival &lt;&lt; &quot;;&quot; &lt;&lt; std::endl;                  
}
</code></pre>
<p>... so geht das ^^ Guck dir mal den operator! von std::istream an ... evtl. dann noch mal gucken was bei std::istream::clear und was bei std::istream::ignore genau passiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392082</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 25 Oct 2007 18:28:41 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Fri, 26 Oct 2007 08:42:19 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>Also der folgende Code ergibt bei mir das selbe:</p>
<pre><code>#include &lt;iostream&gt; 
#include &lt;sstream&gt; 
#include &lt;fstream&gt; 
#include &lt;stdexcept&gt; 
#include &lt;limits&gt;
using namespace std; 
int main(void) 
{ 
   int ival; 
   while(cin &gt;&gt; ival, !cin.eof()) 
   { 
      if(cin.fail()) 
      { 
         cerr &lt;&lt; &quot;BAD DATA&quot;; 
         cin.clear(istream::failbit); 
         cin.ignore(numeric_limits&lt;size_t&gt;::max(),'\n'); 
         continue; 
      }                 
   }     
}
</code></pre>
<p>(D)Evils Code funktioniert zwar, aber er ist einfach ein ganz anderer Weg zur Lösung.<br />
Ich würde aber am liebsten den Weg zur Lösung verstehen, der im Buch gesagt wird.*<br />
Ich hab als Compiler DEV C++... vielleicht liegts ja dadran <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>cya<br />
David</p>
<p>*Also so mit Failbits und Statusflags das Lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392334</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 26 Oct 2007 08:42:19 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Fri, 26 Oct 2007 09:11:56 GMT]]></title><description><![CDATA[<p>Hallo,<br />
du verwendest die Methode clear falsch. clear löscht a) alle Fehlerbits und b) setzt das Fehler-bit, das an die Methode übergeben wird. Der Default-Wert ist basic_ios::goodbit, du übergibst aber failbit. D.h. nach dem Aufruf von clear ist wieder das failbit gesetzt; nicht das was du eigentlich willst.</p>
<p>Weiterhin: ignore erwartet einen Wert vom Typ streamsize. streamsize ist ein *signed* Integertype. Du übergibst aber numeric_limits&lt;size_t&gt;::max(), wobei size_t ein *unsigned* Integertype ist. D.h. bei der Umwandlung kann -1 herauskommen und wenn deine Implementation z.B. das Argument auf &gt; 0 vergleicht, passiert hier gar nix.</p>
<p>Korrekt wäre:<br />
a) clear()<br />
b) Verwendung von std::numeric_limits<a href="std::streamsize" rel="nofollow">std::streamsize</a>::max()</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;fstream&gt;
#include &lt;stdexcept&gt;
#include &lt;limits&gt;
using namespace std;
int main(void)
{
   int ival;
   while(cin &gt;&gt; ival, !cin.eof())
   {
      if(cin.fail())
      {
         cerr &lt;&lt; &quot;BAD DATA&quot;;
         cin.clear();
				 cin.ignore(numeric_limits&lt;std::streamsize&gt;::max(),'\n');
         continue;
      }                
   }    
}
</code></pre>
<p>So wird ein Schuh draus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392351</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Fri, 26 Oct 2007 09:11:56 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Fri, 26 Oct 2007 09:23:20 GMT]]></title><description><![CDATA[<p>WOW!<br />
Endlich ein Quelltext, welcher Funktioniert.<br />
Super!!!</p>
<p>Aber noch eine Frage:</p>
<p>EOF heißt meines Wissens 'End Of File'.</p>
<p>Was genau hat dieser Header der schleife für einen Sinn?<br />
Wann wird das EOF-Bit im Stream gesetzt?</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392356</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 26 Oct 2007 09:23:20 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Fri, 26 Oct 2007 10:13:43 GMT]]></title><description><![CDATA[<p>Ja, EOF ist das Dateiende - das wird gesetzt, wenn die Datei zu Ende ist (wie der Name schon andeutet). Für cin löst du einen EOF aus, indem du Ctrl+Z oder Ctrl+D drückst (hängt vom System ab).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392382</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 26 Oct 2007 10:13:43 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Fri, 26 Oct 2007 10:27:39 GMT]]></title><description><![CDATA[<p>Ahh!!!<br />
Dein letzter Satz hat meine Frage schon beantwortet... habe das mal ausprobiert und wenn ich in meinem Schleifenprogramm Strg+Z drücke wirds tatsächlich beendet!!! <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>THX</p>
<p>cya<br />
David</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392392</guid><dc:creator><![CDATA[777]]></dc:creator><pubDate>Fri, 26 Oct 2007 10:27:39 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Fri, 26 Oct 2007 10:36:09 GMT]]></title><description><![CDATA[<p>Kleine Ergänzung: Vielleicht solltest du eine andere Kennung für &quot;das war der letzte Wert&quot; verwenden als ein EOF. Wenn der User die Eingaben mit Strg+Z abbricht, ist cin nämlich anschließend &quot;tot&quot; (und ich bin mir auch nicht sicher, ob du die Konsole aus dem Programm heraus reaktivieren kannst) und du kannst keine Eingaben mehr entgegennehmen.</p>
<p>Ich würde es eher so lösen:</p>
<pre><code class="language-cpp">while(true)//wird später per break verlassen
{
    cin &gt;&gt; ival
    if(cin.fail())
    {
        cerr &lt;&lt; &quot;BAD DATA&quot;;
        cin.clear();
        char test = cin.get()
        if(test=='q') break;

        cin.ignore(numeric_limits&lt;std::streamsize&gt;::max(),'\n');
        continue;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1392396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392396</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 26 Oct 2007 10:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Fri, 26 Oct 2007 10:51:12 GMT]]></title><description><![CDATA[<p>Wenn ich auch mal was sagen darf: EDV <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="😃"
    /></p>
<p>Gruß Tobi.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392404</guid><dc:creator><![CDATA[T0bi]]></dc:creator><pubDate>Fri, 26 Oct 2007 10:51:12 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Fri, 26 Oct 2007 12:11:39 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Wenn der User die Eingaben mit Strg+Z abbricht, ist cin nämlich anschließend &quot;tot&quot; (und ich bin mir auch nicht sicher, ob du die Konsole aus dem Programm heraus reaktivieren kannst)</p>
</blockquote>
<p>Doch, man kann den Toten wieder zum Leben erwecken:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

struct StreamDefi{
  void brizzl(std::ios&amp; io, int voltage) {
    io.clear();
    ++voltage;  //supress warnings about unused variables
  }
}

using std::cin;
using std::cout;

int main() {
  for (char c; cin; cin.get(c)) cout &lt;&lt; c;
  if (cin.eof()) {
    StreamDefi Defibrilator;
    Defibrilator.brizzl(cin, 240); //BRZZL cin lebt wieder!
  }
}
</code></pre>
<p>*scnr*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1392465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1392465</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 26 Oct 2007 12:11:39 GMT</pubDate></item><item><title><![CDATA[Reply to Eingaben lesen on Mon, 29 Oct 2007 08:25:15 GMT]]></title><description><![CDATA[<p>Wie gesagt, ich war mir nicht sicher. Aber clear() setzt afaik nur die Statusflags von cin zurück - ob das ausreicht, um die dahinterliegende Konsole wieder zu reaktivieren, ist die andere Frage.</p>
<p>(btw, was soll das '++voltage' bringen?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1393940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1393940</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 29 Oct 2007 08:25:15 GMT</pubDate></item></channel></rss>