2010-04-04 7 views
8

¿Cuál es una mejor manera de borrar la entrada cin? Pensé que cin.clear y cin.ignore era una buena manera?Clearing cin input: es cin.ignore no es una buena manera?

Código:

void clearInput() 
{ 
    cin.clear(); 
    cin.ignore(1000,'\n'); 
    //cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); 

} 

Mi maestro me dio esta respuesta:

esto es básicamente diciendo que su clearInput no funciona FYI: ignore nunca es una buena idea como una forma de deshacerse de todo lo que queda en una línea

y su examen de esta falla es exactamente la razón por la cual ahora ve claro que la forma correcta

Ella también me ha dicho esto siguiente:

en ignorar lo que necesita adivinar cómo muchos caracteres que desea ignorar Si se Conozca absolutamente sus datos y sigue un formato estricto - como en Excel hojas de cálculo, ignorar es realmente bueno. Si NO se encuentra en este tipo de archivo, , entonces NUNCA use ignore. Pregunta, ¿sus datos están bien formados? Si es así, use ignore. Si no, no use ignorar.

¿Lista TODA la manera de obtener datos? 1) hay extracción >>

y también hay ??????

favor haga una lista para mí

+0

¿Por qué? ¿Piensa que ignorar significa "ignorar"? Extrae y lanza los personajes, presumiblemente lo que quería que hicieras manualmente. – Duck

+3

Parece que tu profesor es mediocre. Hasta donde yo sé, 'clear' then' ignore' es la forma estándar de borrar la línea. Entonces, de nuevo, mi conocimiento de la corriente es bajo. – GManNickG

+0

Iría un poco más allá de "algo malo". La mejor suerte en la clase y parece que deberías "ignorarlo". – Potatoswatter

Respuesta

4

La respuesta de su profesor no está nada clara (al menos para mí).

En cuanto ignore, su profesor es malo, en principio: ignore es the standard idiom de cómo borrar una corriente (como se muestra por Potatocorn, esto siquiera se menciona en la norma).

Sin embargo, es importante notar que cin.ignore(1000) es de hecho una mala manera de hacer esto: esto sólo supone que no habrá más de 1000 caracteres en el búfer. Nunca use ese número mágico en ignore.

lugar de ello, o bien utilizar

  1. cin.rdbuf()->in_avail() (es decir, el número disponible de caracteres en el búfer de lectura) 1), o utilizar
  2. numeric_limits<streamsize>::max().

1) Desafortunadamente, in_avail se rompe en algunos recientes VC (?) Compiladores por lo que este método no es muy portátil.

+0

bien, no estoy exactamente seguro de lo que ella quiere de mí aquí .. hay extracción (>>), ¿supongo que el otro en el que está pensando es getline? ¿podrían cin.getline y cin.clear utilizarse en este sentido? y cómo sé si la entrada ha sido borrada? – codefail

+0

@igor: puede repetidamente 'getline' (o' get') hasta que se indique EOF o error. Pero no veo cómo esto sea de ninguna manera superior a 'ignorar'. –

+0

su respuesta me pregunta por qué no puedo usar ignorar como unicornio de nariz roja señaló: http://pastebin.com/eTWkPuFb – codefail

5

copiar y pegar de la norma,

basic_istream<charT,traits>& 
ignore(streamsize n = 1, int_type 
delim = traits::eof()); 

Efectos: se comporta como una función de entrada sin formato (como se describe en 27.6.1.3, Párrafo 1). Después de construir un objeto centinela, extrae los caracteres y los descarta. Caracteres se extraen hasta que cualquiera de las siguientes situaciones:

  • si n != numeric_limits<streamsize>::max() (18.2.1), se extraen n caracteres
  • de fin de archivo se produce en la secuencia de entrada (en cuyo caso la función de llamadas setstate(eofbit), que pueden lanzar ios_base::failure (27.4.4.3));
  • c == delim para el siguiente carácter de entrada disponible c (en cuyo caso c es extraído).

Ha comentado línea con numeric_limits<>::max es superior, pero parece como si no desea utilizar algo que no entiende por completo, lo que también es bueno.

Lo único que alguien podría querer además de ignore es el comportamiento de no bloqueo, es decir, no espere a que el usuario presione return si el terminal está en modo sin búfer. Pero eso no está completamente respaldado por iostreams hasta donde yo sé.

+0

INCLINACIÓN: "Si n! = Numeric_limits :: max() (18.2.1), se extraen n caracteres.".Pero, no hay mención de lo que sucede cuando n == numeric_limits :: max()! – Casey

+0

@Casey Es ilimitado. 'numeric_limits :: max()' rara vez es menos de 4 GB, por lo que no tienes suerte si necesitas ignorar exactamente 4 GB + 1. – Potatoswatter

Cuestiones relacionadas