You are on page 1of 6

Objeto cin

Se trata de un objeto global definido en "iostream.h". En ejemplos anteriores ya hemos usado el operador >>. El operador >> Ya conocemos el operador >>, lo hemos usado para capturar variables. istream &operator>>(int& Este operador est! sobrecargado en cin para los tipos est!ndar" int&, short&, long&, double&, float&, charamp#& y char$. %dem!s, el operador && devuelve una referencia objeto ostream, de modo 'ue puede asociarse. Estas asociaciones se eval(an de i)'uierda a derecha, y permiten e*presiones como" cin >> var+ >> var,# cin >> variable# -uando se usa el operador >> para leer cadenas, la lectura se interrumpe al encontrar un car!cter ./0., . . o ./n.. 1ay 'ue tener cuidado, ya 'ue e*iste un problema cuando se usa el operador >> para leer cadenas" cin no comprueba el desbordamiento del espacio disponible para el almacenamiento de la cadena, del mismo modo 'ue la funci2n gets tampoco lo hace. 3e modo 'ue resulta poco seguro usar el operador >> para leer cadenas. 4or ejemplo, declaramos" char cadena5+06# cin >> cadena# Si el usuario introduce m!s de die) caracteres, los caracteres despu7s de d7cimo se almacenar!n en una )ona de memoria reservada para otras variables o funciones. E*iste un mecanismo para evitar este problema, consiste en formatear la entrada para limitar el n(mero de caracteres a leer" char cadena5+06# cin.8idth(si)eof(cadena # cin >> cadena# 3e este modo, aun'ue el usuario introdu)ca una cadena de m!s de die) caracteres s2lo se leer!n die). 9unciones interesantes de cin 1ay 'ue tener en cuenta 'ue cin es un objeto de la clase "istream", 'ue a su ve) est! derivada de la clase "ios", as: 'ue heredar! todas las funciones y operadores de ambas clases. Se mostrar!n todas esas funciones con m!s detalle en la documentaci2n de las bibliotecas, pero veremos ahora las 'ue se usan m!s frecuentemente. 9ormatear la entrada El formato de las entradas de cin, al igual 'ue sucede con cout, se puede modificar mediante flags. Estos flags pueden leerse o modificarse mediante las funciones flags, setf y unsetf. ;tro medio es usar manipuladores, 'ue son funciones especiales 'ue sirven para cambiar la apariencia de una operaci2n de salida o entrada de un stream. Su efecto s2lo es v!lido para una operaci2n de entrada o salida. %dem!s devuelven una referencia al stream, con lo 'ue pueden ser insertados en una cadena entradas o salidas. 4or el contrario, modificar los flags tiene un efecto permanente, el formato de salida se modifica hasta 'ue se restaure o se modifi'ue el estado del flag. Funciones manipuladoras con parmetros 4ara usar estos manipuladores es necesario incluir el fichero de cabecera iomanip. E*isten cuatro de estas funciones manipuladoras aplicables a cin" set8, setbase, setiosflags y resetiosflags. <odas trabajan del mismo modo, y afectan s2lo a la siguiente entrada o salida. En el caso de cin, no todas las funciones manipuladoras tienen sentido, y algunas trabajan de un modo algo diferentes 'ue con streams de salida. Manipulador setw 4ermite establecer el n(mero de caracteres 'ue se leer!n en la siguiente entrada desde cin. 4or ejemplo" =include &iostream> =include &iomanip> using namespace std# int main( > char cad5+06#

cout && "-adena"" cin >> set8(+0 >> cad# cout && cad && endl return 0# ? @a salida tendr! este aspecto, por ejemplo" -adena" +,ABCDEFG0+,ABCD +,ABCDEFG 1ay 'ue tener en cuenta 'ue el resto de los caracteres no le:dos por sobrepasar los die) caracteres, se 'uedan en el buffer de entrada de cin, y ser!n le:dos en la siguiente operaci2n de entrada 'ue se haga. Ya veremos algo m!s abajo c2mo evitar eso, cuando veamos la funci2n "ignore". El manipulador set8 no tiene efecto cuando se leen n(meros, por ejemplo" =include &iostream> =include &iomanip> using namespace std# int main( > int *# cout && "Entero"" cin >> set8(A >> * cout && * && endl return 0# ? @a salida tendr! este aspecto, por ejemplo" Entero" +,ABCDE +,ABCDE Manipulador setbase 4ermite cambiar la base de numeraci2n 'ue se usar! para la entrada de n(meros enteros. S2lo se admiten tres valores" F, +0 y +D, es decir, octal, decimal y he*adecimal. 4or ejemplo" =include &iostream> =include &iomanip> using namespace std# int main( > int *# cout && "Entero" "# cin >> setbase(+D >> *# cout && "3ecimal" " && * && endl# return 0# ? @a salida tendr! este aspecto" Entero" fedB 3ecimal" DC,AD Manipuladores setiosflags y resetiosflags 4ermiten activar o desactivar, respectivamente, los flags de formato de entrada. E*isten 'uince flags de formato a los 'ue se puede acceder mediante un enum definido en la clase ios" flag %cci2n sHip8s ignora espacios en operaciones de lectura left ajusta la salida a la i)'uierda right ajusta la salida a la derecha internal deja hueco despu7s del signo o el indicador de base dec conversi2n a decimal oct conversi2n a octal

he* conversi2n a he*adecimal sho8base muestra el indicador de base en la salida sho8point muestra el punto decimal en salidas en punto flotante uppercase muestra las salidas he*adecimales en may(sculas sho8pos muestra el signo .I. en enteros positivos scientific muestra los n(meros en punto flotante en notaci2n e*ponencial fi*ed usa el punto decimal fijo para n(meros en punto flotante unitbuf vac:a todos los buffers despu7s de una inserci2n stdio vac:a los buffers stdout y stderr despu7s de una inserci2n 3e los flags de formato listados, s2lo tienen sentido en cin los siguientes" sHip8s, dec, oct y he*. Jeamos un ejemplo" =include &iostream> =include &iomanip> using namespace std# int main( > char cad5+06# cout && "-adena" "# cin >> setiosflags(ios""sHip8s >> cad# cout && "-adena" " && cad && endl# return 0# ? @a salida tendr! este aspecto" -adena" prueba -adena" prueba Manipuladores sin parmetros E*isten otro tipo de manipuladores 'ue no re'uieren par!metros, y 'ue ofrecen pr!cticamente la misma funcionalidad 'ue los anteriores. @a diferencia es 'ue los cambios son permanentes, es decir, no s2lo afectan a la siguiente entrada, sino a todas las entradas hasta 'ue se vuelva a modificar el formato afectado. Kanipuladores dec, he* y oct inline ios& dec(ios& i inline ios& he*(ios& i inline ios& oct(ios& i 4ermite cambiar la base de numeraci2n de las entradas de enteros" 9unci2n %cci2n dec -ambia la base de numeraci2n a decimal he* -ambia la base de numeraci2n a he*adecimal oct -ambia la base de numeraci2n a octal El cambio persiste hasta un nuevo cambio de base. Ejemplo" =include &iostream> using namespace std# int main( > int *, y, )# cout && "Entero decimal (* y ) " "# cin >> dec >> * >> y >> )# cout && "Enteros" " && * && ", " && y && ", " && ) && endl# cout && "Entero octal (* y ) " "# cin >> oct >> * >> y >> )# cout && "Enteros" " && * && ", " && y && ", " && ) && endl# cout && "Entero he*adecimal (* y ) " "# cin >> he* >> * >> y >> )# cout && "Enteros" " && * && ", " && y && ", " && ) && endl# return 0# ? @a salida tendr! 7ste aspecto"

Entero decimal (* y ) " +0 BC ,C Enteros" +0, BC, ,C Entero octal (* y ) " EB +, AC Enteros" D0, +0, ,G Entero he*adecimal (* y ) " de fC ff Enteros" ,,,, ,BC, ,CC Funcin ws e*tern istream& 8s(istream& ins # Lgnora los espacios iniciales en una entrada de cadena. Ejemplo" =include &iostream> using namespace std# int main( > char cad5+06# cout && "-adena" "# cin >> 8s >> cad# cout && "-adena" " && cad && endl# return 0# ? @a salida tendr! 7ste aspecto" -adena" hola -adena" hola Funcin width() -ambia la anchura en caracteres de la siguiente entrada de stream" int 8idth( # int 8idth(int # @a primera forma devuelve el valor de la anchura actual, la segunda permite cambiar la anchura para la siguiente entrada, y tambi7n devuelve el valor actual de la anchura. Esta funci2n no tiene efecto con variables 'ue no sean de tipo cadena. char cadena5+06# cin.8idth(si)eof(cadena # cin >> cadena# Funcin setf() 4ermite modificar los flags de manipulaci2n de formato" long setf(long # long setf(long valor, long mascara # @a primera forma activa los flags 'ue est7n activos tanto en el par!metro y deja sin cambios el resto. @a segunda forma activa los flags 'ue est7n activos tanto en valor como en m!scara y desactiva los 'ue est7n activos en masH, pero no en valor. 4odemos considerar 'ue masH contiene activos los flags 'ue 'ueremos modificar y valor los flags 'ue 'ueremos activar. %mbos devuelven el valor previo de los flags. int *# cin.setf(ios""oct, ios""dec M ios""oct M ios""he* # cin >> *# Funcin unsetf() 4ermite eliminar flags de manipulaci2n de formato" void unsetf(long mascara # 3esactiva los flags 'ue est7n activos en el par!metro.

Nota" en algunos compiladores he comprobado 'ue esta funci2n tiene como valor de retorno el valor previo de los flags. int *# cin.unsetf(ios""dec M ios""oct M ios""he* # cin.setf(ios""he* # cin >> *# Funcin flags() 4ermite cambiar o leer los flags de manipulaci2n de formato" long flags ( const# long flags (long valor # @a primera forma devuelve el valor actual de los flags. @a segunda cambia el valor actual por valor, el valor de retorno es el valor previo de los flags. int *# long f# f O flags( # f &O P(ios""he* M ios""oct M ios""dec # f MO ios""dec# cin.flags(f # cin >> *# Funcin get @a funci2n get( tiene tres formatos" int get( # istream& get(char& c # istream& get(char$ ptr, int len, char delim O ./n. # Sin parmetros, lee un carcter, y lo devuelve como valor de retorno: Nota" Esta forma de la funci2n get( se considera obsoleta. Con un parmetro, lee un carcter: En este formato, la funci2n puede asociarse, ya 'ue el valor de retorno es una referencia a un stream. 4or ejemplo" char a, b, c# cin.get(a .get(b .get(c # Con tres parmetros: lee una cadena de caracteres: En este formato la funci2n get lee caracteres hasta un m!*imo de .len. caracteres o hasta 'ue se encuentre el car!cter delimitador. char cadena5,06# cin.get(cadena, ,0, .=. # Funcin getline 9unciona e*actamente igual 'ue la versi2n con tres par!metros de la funci2n get( , salvo 'ue el car!cter delimitador tambi7n se lee, en la funci2n get( no. istream& getline(char$ ptr, int len, char delim O ./n. # Funcin read @ee n caracteres desde el cin y los almacena a partir de la direcci2n ptr. istream& read(char$ ptr, int n # Funcin ignore Lgnora los caracteres 'ue a(n est!n pendientes de ser le:dos"

istream& ignore(int nO+, int delim O E;9 # Esta funci2n es (til para eliminar los caracteres sobrantes despu7s de hacer una lectura con el operador >>, get o getline# cuando leemos con una achura determinada y no nos interesa el resto de los caracteres introducidos. 4or ejemplo" =include &iostream> =include &iomanip> using namespace std# int main( > char cad5+06# int i# cout && "-adena" "# cin >> set8(+0 >> cad# cout && "Entero" "# cin.ignore(+00, ./n. >> i# cout && "-adena" " && cad && endl# cout && "Entero" " && i && endl# cin.get( # return 0# ? @a salida podr:a tener este aspecto" -adena" cadenademasiadolarga Entero" +,A -adena" cadenadem Entero" +,A Funcin peek Esta funci2n obtiene el siguiente car!cter del buffer de entrada, pero no lo retira, lo deja donde est!. int peeH( # Funcin putback -oloca un car!cter en el buffer de entrada" istream& putbacH(char # Funcin scan @ee variables con formato, es an!logo al scanf de "stdio"" istream& scan(char$ format, ... # Nota" algunos compiladores no disponen de esta funci2n. Ejemplo" char l# int i# float f# char cad5+C6# cin.scan("QcQdQfQs", &l, &i, &f, cad #

You might also like