2011-04-13 12 views
5

En primer lugar mi entendimiento es que¿Por qué no funciona std :: noskipws, o qué se supone que debe hacer?

cin >> std::noskipws >> str; 

debe pegarse una línea entera de cin como "tengo espacios" en str. Sin embargo, esto solo pone "yo" en str. Esto podría ser una suposición falsa en cuyo caso ¿qué hace std::noskipws?

Sé que hay una función std::getline y eso funciona, pero simplemente por razones educativas, decidí intentar que std::noskipws me funcionara. Lo he intentado en el pasado y simplemente nunca funciona, así que normalmente me voy y uso std::getline.

Lo que creo que he encontrado hasta ahora es que std::noskipws técnicamente solo desarma std::skipws cuales internamente al basic_iostream sólo llama

ios_base::unsetf(std::ios::skipws); 

o

ios_base::unsetf(ios_base::skipws); 

así que he intentado heredar mi propia forma corriente basic_iostream y establecer esos indicadores (desarmarlos) manualmente. Todavía no hay dados.

Entonces, ¿estoy completamente fuera de la base o hay una manera de hacer que esto funcione?

+0

Buena pregunta; bienvenido a SO :) –

+0

Quizás quiera [cambiar el delimitador] (http://stackoverflow.com/a/7304184/3484570), pero lo dudo. – nwp

Respuesta

10

std :: noskipws le dice al istream que no se salte ningún espacio en blanco cuando intente leer un tipo. Cuando no hay espacio en blanco al frente, entonces la bandera no tiene impacto.

+0

ahh, es justo, supongo que no hay ninguna bandera que diga que el espacio en blanco no es un delimitador? –

+0

Si quiere leer una línea completa de entrada, use 'getline'. –

+0

@Digital: puede redefinir los espacios en blanco como quiera utilizando la faceta de formato 'std :: ctype'. Si estás dispuesto a entrar en facetas. – Potatoswatter

2

std::skipws funciona de la siguiente manera: std::istream siempre mantiene una posición de lectura actual. Si se configura std::skipws, antes de llamar a operator>>, la posición de lectura actual se avanza al primer carácter que no sea de espacio.

El comportamiento que se está viendo (se detiene en el primer espacio después 'i') es causada por operator>> para std::string (y std::wstring). Ese operador no toma en cuenta las banderas std::istream. Un operator<< para otro tipo puede decidir lo contrario y continuar incluso a través de espacios.

Cuestiones relacionadas