En programación existen diferentes métodos para cin, como get, getline e ignore. A continuación se explica cada uno de ellos.
Como leer en C++ con cin incluyendo espacios con el método get
En C++ es posible leer datos separados por espacios en blanco o intro, por medio del operador de extracción sobre cin (>>). Más si se quieren leer caracteres, incluyendo los espacios en blanco o intro, se utiliza el método de get. Get extrae un caracter de cin y lo guarda en la variable. Si se extrae y es el fin del fichero, se activa el indicador de fin de fichero. Si el buffer de entrada se encuentra vacío, cuando el programa llega a la instrucción, se detiene en espera de teclear un caracter y pulsar intro.
cin.get (caracter) ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <iostream> //Es un componente de la biblioteca estándar del lenguaje de programación c++ que es utilizado para operaciones de entrada/salida using namespace std; //Especifica que los miembros de un namespace van a utilizarse frecuentemente en un programa int main(){ //Cuerpo del programa, agrupa las instrucciones a ejecutar int num; //El tipo de dato es un entero //lee un número entero cout << "Introduce un numero entero: "; //Muestra en pantalla el mensaje entre comillas cin >> num; cout << "El numero es " << ((num%2==0)? "par" : "impar") << endl; //lee un carácter cout << "Introduce un caracter: "; cin.get(c); cout << "El caracter" << ((c>='a' and c<='z')?" es ":" no es"); cout << " una letra minuscula" << endl; return 0; //Finalización normal del programa } //Agrupar |
*García Enrique H. (2014). “Leer caracteres y cadenas de caracteres en C++”, en Programación C++. Disponible en: http://ejercicioscpp.blogspot.mx/2013/07/c-leer-caracteres-cadenas-de-caracteres.html (22/02/16).
SALIDA DEL PROGRAMA:
Introduce un numero entero: 20
El numero es par
Introduce un caracter: El caracter no es una letra minuscula
Presione una tecla para continuar . . .
El intro también se extrae del flujo de caracteres.
Al tener un flujo de entrada cin (18\n), por medio de la instrucción cin >> num; se le asigna a num el valor 18. El valor se extrae de cin pero permanece el \n, por lo que se tiene un flujo de entrada después de leer el entero: \n.
Cuando se llega a cin.get(c); se extrae de cin el intro y se asigna a c. Esto causa que no se detenga la ejecución del programa para introducir el caracter, por lo que se produce un resultado no deseado.
Ahora es necesario limpiar el buffer con el método de ignore.
Como limpiar el buffer con ignore
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <iostream> //Es un componente de la biblioteca estándar del lenguaje de programación c++ que es utilizado para operaciones de entrada/salida using namespace std; //Especifica que los miembros de un namespace van a utilizarse frecuentemente en un programa int main(){ //Cuerpo del programa, agrupa las instrucciones a ejecutar int num; //El tipo de dato es un entero //lee un número entero cout << "Introduce un numero entero: "; //Muestra en pantalla el mensaje entre comillas cin >> num; //Lee y guarda el valor introducido cout << "El numero es " << ((num%2==0)? "par" : "impar") << endl; //limpia el buffer de entrada cin.ignore(numeric_limits<int>::max(),'\n'); //lee un carácter cout << "Introduce un caracter: "; cin.get(c); cout << "El caracter" << ((c>='a' and c<='z')? " es ":" no es"); cout << " una letra minuscula" << endl; return 0; //Finalización normal del programa } //Agrupar |
*García Enrique H. (2014). “Leer caracteres y cadenas de caracteres en C++”, en Programación C++. Disponible en: http://ejercicioscpp.blogspot.mx/2013/07/c-leer-caracteres-cadenas-de-caracteres.html (22/02/16).
Como leer en C++ con cin incluyendo espacios con el método getline
El operador de extracción sobre cin no sirve para leer cadenas de caracteres con espacios en blanco. Para esto se utiliza el método getline.
cin.getline(cadena, número, caracter final)
Getline lee la serie de caracteres desde el flujo de entrada y los guarda en la variable cadena. Se leen hasta el final del flujo, hasta el primer caracter que coincide con el caracter final que se haya especificado. Getline añade el caracter nulo al final de la cadena de manera automática.
El siguiente programa muestra la diferencia al leer cadenas de caracteres con y sin el método de getline:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> //Es un componente de la biblioteca estándar del lenguaje de programación c++ que es utilizado para operaciones de entrada/salida using namespace std; //Especifica que los miembros de un namespace van a utilizarse frecuentemente en un programa int main(){ //Cuerpo del programa, agrupa las instrucciones a ejecutar cout << "Introduce nombre y apellidos: "; //Muestra en pantalla lo que está entre comillas cin.getline(nombre,40); //lectura incluyendo espacios cout << "Hola " << nombre << endl; cout << "Introduce nombre y apellidos: "; cin >> nombre; //lectura sin incluir espacios cout << "Hola " << nombre << endl; return 0; //Finalización normal del programa } //Agrupar |
*García Enrique H. (2014). “Leer caracteres y cadenas en C++”, en Programación C++. Disponible en: http://ejercicioscpp.blogspot.mx/2013/07/c-leer-caracteres-cadenas-de-caracteres.html /22/02/2016).
SALIDA DEL PROGRAMA:
Introduce nombre y apellidos: Emilio Perez Ochoa
Hola Emilio Perez Ochoa
Introduce nombre y apellidos: Emilio Perez Ochoa
Hola Emilio
Presione una tecla para continuar . . .
Fuente (s):
*García Enrique H. (2014). “Leer caracteres y cadenas de caracteres en C++”, en Programación C++. Disponible en: http://ejercicioscpp.blogspot.mx/2013/07/c-leer-caracteres-cadenas-de-caracteres.html (22/02/2016).
no es necesario declarar una variable nombre? cin.getline(nombre,40);
Hola, estoy haciendo un programa en c++ de subneteo para un trabajo de la escuela, como puedo hacer para cuando ingrese el ip (ej 192.168.1.0) pueda ingresar el “.” por que no me deja, si lo ingreso me salta hasta el final del programa.
para esto también me sirve el get?
desde ya muchas gracias espero su respuesta