Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Stream-frage

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.10.2003, 19:43 Uhr
(un)wissender
Niveauwart



C++:
#include <iostream>

int main()
{
    int precision;
    do {
        std::cin.clear();
        std::cout << "\nIterations: ";      
        std::cin >> precision;
    } while(std::cin.fail());

    return 0;
}



Der Code soll einfach solange einlesen, bis ein gültiger Integer eingegben wurde.
Nur leider gibt es eine Endlosschleife, sobald man keinen gültigen Integer eingibt(also z.B einen Buchstaben).
Warum ist das so?
Eigentlich müßte der Stream cin doch wieder durch clear() funktionieren und das Failbit gelöscht werden!?
Wie geht es richtig?

Danke!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.10.2003, 20:23 Uhr
0xdeadbeef
Gott
(Operator)


clear setzt nur die Flags auf den Normalzustand zurück, nimmt aber nicht die bytes aus dem Stream. schreib hinter das do{ noch

C++:
std::cin.ignore(std::cin.rdbuf()->in_avail());


std::cin.rdbuf gibt dir das streambuf-Objekt, dass cin verwendet, in_avail gibt die Anzahl der Zeichen im Buffer zurück. std::cin.ignore ignoriert die angegebene Anzahl Zeichen, also in diesem Fall genau so viele, wie sich im Buffer befinden.

--edit: Syntax-Fehler behoben, rdbuf gibt einen Zeiger zurück...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 26.10.2003 um 20:41 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.10.2003, 20:38 Uhr
virtual
Sexiest Bit alive
(Operator)


Clear löscht nur das Status bit, nicht jedoch die Zeichen, die eingegeben wurden. Hier würde ich std::cin::ignore verwenden. Oft wird empfohlen, dies mit der avail_in() Funktion vom darunterliegenden Streambuffer zu verknüpfen:

C++:
#include <iostream>

int main()
{
    int precision;
    do {
        if (!std::cin)
        {
            std::cin.clear();
            std::cin.ignore(std::cin.rdbuf()->in_avail());
        }
        std::cout<<"Iterations: "<<std::flush;
        std::cin >> precision;
    } while(std::cin.fail());

    return 0;
}


Leider habe ich die Erfahrung geamcht, daß das oft nicht funktioniert, deshalb kannst Du eher sowas probieren:

C++:
#include <iostream>

int main()
{
    int precision;
    do {
        if (!std::cin)
        {
            std::string throw_away;
            std::cin.clear();
            std::getline(std::cin, throw_away);
        }
        std::cout<<"Iterations: "<<std::flush;
        std::cin >> precision;
    } while(std::cin.fail());

    return 0;
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.10.2003, 22:26 Uhr
(un)wissender
Niveauwart


Wow, danke, das sieht ja mies aus!
Sehr umständlich geregelt das Ganze.

Es funktioniert bei mir tatsächlich nur virtuals zweite Lösung.
Das sieht ja fast nach einen C++-Bug aus, oder habe ich nur einfach keine Ahnung?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: