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 parámetros 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#

los flags de formato de entrada.ABCDE +. El manipulador set8 no tiene efecto cuando se leen n(meros.ABCDE Manipulador setbase 4ermite cambiar la base de numeraci2n 'ue se usar! para la entrada de n(meros enteros. cuando veamos la funci2n "ignore". decimal y he*adecimal. respectivamente. Ya veremos algo m!s abajo c2mo evitar eso.cout && "-adena"" cin >> set8(+0 >> cad# cout && cad && endl return 0# ? @a salida tendr! este aspecto. S2lo se admiten tres valores" F. 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" +. se 'uedan en el buffer de entrada de cin. por ejemplo" -adena" +.ABCDEFG 1ay 'ue tener en cuenta 'ue el resto de los caracteres no le:dos por sobrepasar los die) caracteres. octal.AD Manipuladores setiosflags y resetiosflags 4ermiten activar o desactivar. +0 y +D. 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 . y ser!n le:dos en la siguiente operaci2n de entrada 'ue se haga.ABCDEFG0+. 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.ABCD +. es decir.

y 'ue ofrecen pr!cticamente la misma funcionalidad 'ue los anteriores. 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. dec. Kanipuladores dec. " && y && ".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 . oct y he*. Ejemplo" =include &iostream> using namespace std# int main( > int *. " && ) && endl# cout && "Entero octal (* y ) " "# cin >> oct >> * >> y >> )# cout && "Enteros" " && * && ". " && y && ". es decir. )# cout && "Entero decimal (* y ) " "# cin >> dec >> * >> y >> )# cout && "Enteros" " && * && ". " && y && ". " && ) && endl# cout && "Entero he*adecimal (* y ) " "# cin >> he* >> * >> y >> )# cout && "Enteros" " && * && ". 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 parámetros E*isten otro tipo de manipuladores 'ue no re'uieren par!metros. no s2lo afectan a la siguiente entrada. y. @a diferencia es 'ue los cambios son permanentes. " && ) && endl# return 0# ? @a salida tendr! 7ste aspecto" . 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. sino a todas las entradas hasta 'ue se vuelva a modificar el formato afectado.I.

int *# cin. . Esta funci2n no tiene efecto con variables 'ue no sean de tipo cadena. AC Enteros" D0.. .G Entero he*adecimal (* y ) " de fC ff Enteros" . .. pero no en valor. ios""dec M ios""oct M ios""he* # cin >> *# Función unsetf() 4ermite eliminar flags de manipulaci2n de formato" void unsetf(long mascara # 3esactiva los flags 'ue est7n activos en el par!metro. +0. char cadena5+06# cin.C Enteros" +0..8idth(si)eof(cadena # cin >> cadena# Función setf() 4ermite modificar los flags de manipulaci2n de formato" long setf(long # long setf(long valor. y tambi7n devuelve el valor actual de la anchura. BC. %mbos devuelven el valor previo de los flags.Entero decimal (* y ) " +0 BC .BC. long mascara # @a primera forma activa los flags 'ue est7n activos tanto en el par!metro y deja sin cambios el resto.setf(ios""oct. 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 Función 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. 4odemos considerar 'ue masH contiene activos los flags 'ue 'ueremos modificar y valor los flags 'ue 'ueremos activar. @a segunda forma activa los flags 'ue est7n activos tanto en valor como en m!scara y desactiva los 'ue est7n activos en masH. . la segunda permite cambiar la anchura para la siguiente entrada.CC Función ws e*tern istream& 8s(istream& ins # Lgnora los espacios iniciales en una entrada de cadena. .C Entero octal (* y ) " EB +.

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

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