Clearing cin input: Ist cin.ignore kein guter Weg?

8

Was ist eine bessere Methode, cin input zu löschen? Ich dachte cin.clear und cin.ignore war ein guter Weg?

Code:

%Vor%

Mein Lehrer gab mir diese Antwort:

  

Das sagt im Grunde, dass Sie   clearInput funktioniert nicht FYI: ignorieren   ist NIE eine gute Idee als ein Weg   loswerden von allem, was auf einem bleibt   Linie

     

und Ihr Fehler bei diesem Test ist genau   der Grund warum jetzt klar es geht   richtiger Weg

Sie hat mir auch folgendes gesagt:

  

on ignorieren Sie müssen raten, wie   viele Zeichen, die du ignorieren möchtest   Sie wissen absolut Ihre Daten und es   folgt einem strikten Format - wie in Excel   Tabellenkalkulation, ignorieren ist wirklich gut.   Wenn Sie nicht in dieser Art von Datei sind,   dann benutzt du NIEMALS ignorieren. Frage,   Sind deine Daten gut geformt? Wenn ja, verwenden Sie   ignorieren. Wenn nicht, verwende nicht ignorieren.

     

Liste ALLEN Weg, um Daten zu erhalten? 1)   Es gibt Extraktion & gt; & gt;

     

und es gibt auch ??????

     

bitte für mich auflisten

    
codefail 04.04.2010, 03:13
quelle

2 Antworten

4

Die Antwort Ihres Lehrers ist etwas unklar (zumindest für mich).

In Bezug auf ignore ist dein Lehrer im Prinzip falsch: ignore ist das Standard-Idiom , wie man einen Stream löscht (wie von Potatocorn gezeigt, wird dies sogar im Standard erwähnt).

Es ist jedoch wichtig zu beachten, dass cin.ignore(1000) tatsächlich eine schlechte Möglichkeit ist, dies zu tun: dies setzt nur voraus, dass es nicht mehr als 1000 Zeichen im Puffer gibt. Verwenden Sie niemals eine solche magische Zahl in ignore .

Verwenden Sie stattdessen entweder

  1. cin.rdbuf()->in_avail() (d. h. die verfügbare Anzahl von Zeichen im Lesepuffer) 1) , oder verwenden Sie
  2. numeric_limits<streamsize>::max() .

1) Leider ist in_avail bei einigen neueren VC (?) Compilern defekt, daher ist diese Methode nicht sehr portabel.

    
Konrad Rudolph 04.04.2010, 14:51
quelle
5

Kopieren-Einfügen aus dem Standard,

%Vor%      

Effekte: Benimmt sich als unformatiert   Eingabefunktion (wie beschrieben in   27.6.1.3, Absatz 1). Nach dem Aufbau eines Sentry-Objekts   extrahiert Zeichen und verwirft sie.   Zeichen werden bis zu einem von extrahiert   Folgendes passiert:

     
  • wenn n != numeric_limits<streamsize>::max()   (18.2.1), n Zeichen werden extrahiert
  •   
  • Ende der Datei tritt in der Eingabefolge auf (in diesem Fall die Funktion   ruft setstate(eofbit) auf, was möglicherweise der Fall ist   throw ios_base::failure (27.4.4.3));
  •   
  • c == delim für das nächste verfügbare Eingabezeichen c (in diesem Fall c ist   extrahiert).
  •   

Sie haben die Zeile mit numeric_limits<>::max kommentiert, die besser ist, aber es sieht so aus, als ob Sie nicht etwas verwenden wollten, das Sie nicht vollständig verstanden haben, was auch gut ist.

Das einzige, was jemand außer ignore möglicherweise noch möchte, ist das nicht blockierende Verhalten, d. h. warten Sie nicht darauf, dass der Benutzer die Rückkehr drückt, wenn sich das Terminal im ungepufferten Modus befindet. Aber das wird von Iostreams, soweit ich weiß, nicht ganz unterstützt.

    
Potatoswatter 04.04.2010 04:31
quelle

Tags und Links