2008-11-02 58 views

Respuesta

78

Posiblemente:

std::cin.ignore(INT_MAX); 

Este sería el siguiente en e ignorar todo hasta el EOF. (También se puede suministrar un segundo argumento que es el carácter de leer hasta que (por ejemplo: '\n' ignorar una sola línea)

también:. Es posible que desee hacer un:. std::cin.clear(); antes de esto también a restablecer el estado de flujo de

+9

(Viejo lo sé). Despeje antes, más bien, para que la transmisión se ponga en un buen estado donde pueda operar en su memoria intermedia. – GManNickG

+0

Gracias, GMan! Lo hice de la manera incorrecta, primero, y pasé bastante tiempo buscando mi error. – balu

+0

@GManNickG, acaba de arreglar la respuesta. – bwDraco

1

El siguiente debería funcionar:

cin.flush(); 

En algunos sistemas que no está disponible y luego se puede utilizar:

cin.ignore(INT_MAX); 
+1

por qué escribir manualmente un bucle cuando se puede decir ignorar los caracteres INT_MAX leídos hasta que llega a EOF (el valor predeterminado del segundo parámetro). –

+0

Tienes razón :) –

+0

Gunnar, podría ser mejor editar tu publicación para reflejar esto, por las dudas. –

96

yo preferiría las limitaciones de tamaño de C++ sobre las versiones C:

// 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

¡Más importante aún, los valores pueden ser diferentes! (streamsize no tiene que ser int) –

+1

podría citar un ejemplo donde tenemos que ignorar hasta el final del archivo porque si uso 'cin' y uso la primera instrucción de arriba para eliminar el búfer' cin', entonces sigue pidiendo entradas hasta que ingrese 'EOF' presionando' ctrl + d'? – ajay

+0

@ajay: No. Eso es algo que tendrás que decidir. Simplemente estoy explicando lo que hará lo anterior. –

3

prefiero:

cin.clear(); 
fflush(stdin); 

Hay un examen donde cin.ignore simplemente no lo corta, pero no puedo pensarlo en este momento. Fue hace un tiempo cuando necesitaba usarlo (con Mingw).

Sin embargo, fflush (stdin) es un comportamiento indefinido de acuerdo con la norma. fflush() solo está destinado a las transmisiones de salida. fflush (stdin) solo parece funcionar como se esperaba en Windows (con los compiladores GCC y MS al menos) as an extension to the C standard.

Por lo tanto, si lo usa, su código no será portátil.

Ver Using fflush(stdin).

También, vea http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 para una alternativa.

+9

fflush (stdin); es Undefined Behavior (en el lenguaje de programación C), explícitamente así en 7.18.5.2/2 – Cubbi

+1

+1 para suministrar un kludge de trabajo válido. Algunas personas tienen trabajos que otros tienen estándares. – Mikhail

+3

@Mikhail: su trabajo debe incluir la escritura de código estándar compatible. Me aseguraré de evitar usar cualquier cosa que hayas escrito en el futuro. –

3

¿Qué tal:

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

la función in_avail() del streambuf no es confiable, y muchas implementaciones simplemente devuelven cero. Ver: https://connect.microsoft.com/VisualStudio/feedback/details/509337/vc-8-9-sstream-basic-streambuf-sputc-sputn-dont-increment-gcount gnu's libC++ es similar –

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); 

Este fue el único que trabajó para mí al leer de la consola. En cualquier otro caso, leería indefinidamente debido a la falta de \ n, o algo permanecería en el búfer.

EDIT: Descubrí que la solución anterior empeoraba las cosas. Éste sin embargo, funciona:

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

y luego usar la función

__fpurge(stdin) 
0

cin.get() parece tirar de la cadena de forma automática por extraño que parezca (probablemente no se prefiere, sin embargo, ya que esto es confuso y probablemente temperamental).

3

Otra posible solución (manual) es

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

no puedo usar fflush o cin.flush() con CLION por lo que este fue práctico.

+0

loop infinito para mí. – StarWind0

+0

Está funcionando solo si hay un final de línea; de lo contrario, un bucle infinito –

7

He encontrado dos soluciones para esto.

La primera, y más simple, es el uso de std::getline() por ejemplo:

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

... que se deseche el flujo de entrada cuando se llega a una nueva línea. Obtenga más información acerca de esta función here.

Otra opción que descarta directamente la corriente es esto ...

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

Buena suerte!

0

La manera más fácil:

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

Simplemente sitúa el puntero cin al final del flujo de entrada estándar y cin.clear() limpia todos los indicadores de error tales como la bandera EOF.

Cuestiones relacionadas