2008-11-02 5 views

Antwort

78

Möglicherweise:

std::cin.ignore(INT_MAX); 

Dies würde und ignorieren lesen alles bis EOF. (Sie können auch ein zweites Argument liefern, die der Charakter bis (ex zu lesen ist: '\n' eine einzige Zeile zu ignorieren)

auch:. Sie wollen wahrscheinlich ein tun. std::cin.clear(); vor diesem zu dem Strom-Zustand zurückgesetzt

+9

(Old Ich weiß.) Löschen Sie vorher, lieber, so dass der Stream in einen guten Zustand gebracht wird, wo es auf seinem Puffer arbeiten kann. – GManNickG

+0

Danke, GMan! Habe es zuerst falsch gemacht und ziemlich lange nach meinem Fehler gesucht. – balu

+0

@GManNickG, gerade die Antwort behoben. – bwDraco

1

Folgendes sollte funktionieren:

cin.flush(); 

Auf manchen Systemen nicht verfügbar ist und dann können Sie verwenden:

cin.ignore(INT_MAX); 
+1

warum manuell eine Schleife schreiben, wenn Sie sagen können, ignorieren Sie die gelesenen INT_MAX Zeichen, bis es EOF (der Standardwert des zweiten Param) erreicht. –

+0

Sie haben Recht :) –

+0

Gunnar, könnte besser sein, Ihren Beitrag zu bearbeiten, um dies zu reflektieren, nur für den Fall. –

96

ich würde die C++ Größenbeschränkungen über die C-Versionen bevorzugen:

// Ignore to the end of file 
cin.ignore(std::numeric_limits<std::streamsize>::max()) 

// Ignore to the end of line 
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n') 
+14

Noch wichtiger, die Werte könnten anders sein! (streamsize muss nicht int sein) –

+1

könnten Sie bitte ein Beispiel nennen, wo wir bis zum Dateiende ignorieren müssen, denn wenn ich 'cin' verwende und die erste Anweisung oben verwende, um den' cin' Puffer zu löschen, dann ist es Aufforderung zur Eingabe, bis ich 'EOF' durch Drücken von' Strg + d' eingebe? – ajay

+0

@ajay: Nein. Das ist etwas, das Sie entscheiden müssen. Ich erkläre nur, was das oben Gesagte tun wird. –

3

ich ziehe:

cin.clear(); 
fflush(stdin); 

eine Prüfung Es gibt wo cin.ignore es einfach nicht schneidet, aber ich kann es mir im Moment nicht vorstellen. Es war vor einer Weile, als ich es benutzen musste (mit Mingw).

Allerdings ist fflush (stdin) ein undefiniertes Verhalten gemäß dem Standard. fflush() ist nur für Ausgabeströme gedacht. fflush (stdin) funktioniert unter Windows (mit GCC und MS Compilern zumindest) nur wie erwartet. as an extension to the C standard.

Also, wenn Sie es verwenden, wird Ihr Code nicht tragbar sein.

Siehe Using fflush(stdin).

Siehe auch http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 für eine Alternative.

+9

fflush (stdin); ist Undefined Behavior (in der Programmiersprache C), explizit in 7.18.5.2/2 – Cubbi

+1

+1 für die Bereitstellung eines gültigen, Arbeitskludges angegeben. Manche Leute haben Jobs, andere haben Standards. – Mikhail

+3

@Mikhail: Ihre Aufgabe sollte das Schreiben von standardkonformem Code beinhalten. Ich werde sicherstellen, dass Sie nichts verwenden, was Sie in der Zukunft geschrieben haben. –

3

Wie wäre:

cin.ignore(cin.rdbuf()->in_avail()); 
+3

Die Funktion in_avail() des Streambufs ist unzuverlässig, und viele Implementierungen geben nur Null zurück. Siehe: https://connect.microsoft.com/VisualStudio/feedback/details/509337/vc-8-9-strom-basic-streambuf-sputc-sputn-dont-inkrement-gcount gnus libC++ ist ähnlich –

6
int i; 
    cout << "Please enter an integer value: "; 

    // cin >> i; leaves '\n' among possible other junk in the buffer. 
    // '\n' also happens to be the default delim character for getline() below. 
    cin >> i; 
    if (cin.fail()) 
    { 
    cout << "\ncin failed - substituting: i=1;\n\n"; 
    i = 1; 
    } 
    cin.clear(); cin.ignore(INT_MAX,'\n'); 

    cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n"; 

    string myString; 
    cout << "What's your full name? (spaces inclded) \n"; 
    getline (cin, myString); 
    cout << "\nHello '" << myString << "'.\n\n\n"; 
15
cin.clear(); 
fflush(stdin); 

Das ist das einzige, was war das für mich gearbeitet, als von der Konsole zu lesen. In jedem anderen Fall würde es entweder aufgrund von fehlendem \ n unbestimmt lesen oder etwas würde im Puffer bleiben.

EDIT: Ich fand heraus, dass die vorherige Lösung die Dinge noch schlimmer machte. aber diese, funktioniert:

cin.getline(temp, STRLEN); 
if (cin.fail()) { 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
} 
1
#include <stdio_ext.h> 

und verwenden Sie dann Funktion

__fpurge(stdin) 
0

cin.get() scheint es zu spülen automatisch seltsam genug (wahrscheinlich nicht, obwohl bevorzugt, da dies verwirrend ist und wahrscheinlich temperament).

3

Eine weitere mögliche (manuell) Lösung ist

cin.clear(); 
while (cin.get() != '\n') 
{ 
    continue; 
} 

ich nicht Fflush oder cin.flush() mit CLION können so diese sehr praktisch war.

+0

Endlosschleife für mich. – StarWind0

+0

Es funktioniert nur, wenn es ein Ende der Linie gibt, sonst Endlosschleife –

7

Ich habe zwei Lösungen gefunden.

Die erste und einfachste ist std::getline() zum Beispiel zu verwenden:

std::getline(std::cin, yourString); 

... dass der Eingangsstrom verwerfen, wenn es um eine neue Linie bekommt. Lesen Sie mehr über diese Funktion here.

Eine weitere Option, die der Strom diese direkt verwirft ist ...

#include <limits> 
// Possibly some other code here 
cin.clear(); 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

Viel Glück!

0

einfachste Weg:

cin.seekg(0,ios::end); 
cin.clear(); 

Es positioniert nur die CIN-Zeiger am Ende des stdin Stroms und cin.clear() löscht alle Fehlerflags, wie beispielsweise den EOF-Flag.