cin puffer leeren - ENDLOSSCHLEIFE



  • Hallo auch,

    hier mein Code:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int zahl=0;
    
    	// Variante 1 - Fußgesteuerte While-Schleife
    	do
    	{
    		cin.clear();							// zuerst Failbits zurücksetzen
    		cin.ignore( cin.rdbuf()->in_avail() );	// dann Puffer leeren
    
    		// In dieser Reihenfolge klappt es nicht, warum nicht???
    		/*		
    		cin.ignore( cin.rdbuf()->in_avail() );	// zuerst Puffer leeren
    		cin.clear();							// dann Failbits zurücksetzen
    		*/
    
    		cout << "Zahl eingeben: " << endl;
    		cin >> zahl;	
    
    	} while( cin.fail() );
    
    	cout << "Variante 1 : Geschafft! Ihre eingegebene Zahl: " << zahl << endl;
    
    	cout << "Zahl eingeben: " << endl;
    	// Variante 2 - Kopfgesteuerte Whileschleife
    	while( !(cin>>zahl) ) // Solange cin Fail zurückliefert
    	{
    		cin.clear();							// zuerst Failbits zurücksetzen
    		cin.ignore( cin.rdbuf()->in_avail() );	// dann Puffer leeren
    
    		// In dieser Reihenfolge klappt es nicht, warum nicht???
    		/*	
    		cin.ignore( cin.rdbuf()->in_avail() );	// zuerst Puffer leeren
    		cin.clear();							// dann Failbits zurücksetzen
    		*/
    
    		cout << "Zahl eingeben: " << endl;
    	}
    	cout << "Variante 2 : Geschafft! Ihre eingegebene Zahl: " << zahl << endl;
    
    	system( "PAUSE" );
    	return 0;
    }
    

    Im Code deuten Kommentare mein Problem an, ich würde gerne wissen, warum ich in einer Endlosschliefe hängen bleibe, wenn ich die Variation

    cin.ignore( cin.rdbuf()->in_avail() );	// zuerst Puffer leeren
    		cin.clear();
    

    verwende.

    Zuerst Puffer leeren, danach die Anweisung cin.clear() hält mich in der Schleife fest, kann mir das bitte jemand erklären? 🙂

    Vielen Dank schonmal!!!


  • Mod

    Weil in_avail nicht das macht, was du denkst. In der Regel gibt es einfach 0 zurück. Es gibt keinen Eingabepuffer wie du ihn verstehst (zumindest nicht auf der Ebene, auf der der Eingabestream arbeitet), daher ist das Vorhaben von vornherein zum Scheitern verurteilt.



  • Ich habe in_avail schon richtig verstanden und benutze es auch richtig.
    Habe das Problem gefunden, cin.ignore() funktioniert nur, wenn cin.good() true ergibt.

    istream& ignore (streamsize n = 1, int delim = EOF);
    (Cplusplus.com)

    [...]
    Internally, the function accesses the input sequence by first constructing a sentry object (with noskipws set to true). Then (if good), it extracts characters from its associated stream buffer object as if calling its member functions sbumpc or sgetc, and finally destroys the sentry object before returning.
    [...]

    Darum muss ZUERST cin.clear() ausgeführt werden und dann verwirft cin.ignore die im Puffer liegenden CHARACTER.

    Trotzdem vielen Dank für die rasche Hilfe,
    tolles Support, bin angenehm überrascht. 🙂



  • ...



  • Ach so, ich verstehe. 😋
    Vielen Dank


Anmelden zum Antworten