Entrada y salida de datos en C++. Uso de cin, cout, scanf y printf
La entrada y salida de datos en C++ es simple (al menos para los casos más comunes). Con esto hago una comparación entre C++ y Java, pues leer una entrada del usuario por teclado en C++ es bastante simple mientras que en Java implica una serie de conceptos adicionales que la hacen un tanto más complicada. Por suerte para nosotros en esta sección veremos cómo leer por teclado en C++, en otras palabras, asignar a una variable el valor que el usuario escriba por el teclado. Adicional a esto veremos también cómo mostrar texto por pantalla en C++, es decir, salida de datos.
Vamos a comenzar primero con aprender a mostrar texto por pantalla en C++. Este orden se debe a que cuando queremos pedirle algún dato al usuario primero debemos hacerle saber lo que queremos que ingrese y para hacérselo saber debemos mostrarle un mensaje con las indicaciones, por tal motivo es importante primero saber mostrar texto en pantalla en C++ y luego a leer texto por teclado en C++.
Salida de texto por pantalla en C++
Mostrar texto por pantalla en C++ es muy simple. Para imprimir una salida de texto en C++ se hace uso de la instrucción cout, junto con <<. Es importante tener en cuenta que la instrucción cout siempre va acompañada de << para controlar el flujo de datos que sale. No te fijes mucho en ellos, solo ten siempre presente que cout viene acompañado de << para tener cout << como resultado.
Veamos algunos ejemplos para mostrar texto por pantalla en C++:
Ejemplo 1 de impresión de texto por pantalla en C++, usando cout
#include "iostream"
using namespace std;
int main()
{
//Se muestra un mensaje por pantalla.
cout << "Hola Mundo" << " Desde ProgramarYa." << "\n";
return 0;
}
El ejemplo que acabas de ver es bastante sencillo, excepto por un detalle. Si ejecutar este código en tu pantalla aparecerá un mensaje diciendo "Hola Mundo Desde ProgramarYa.". Tal como habrás notado el operador "<<" se usa para concatenar (unir) dos cadenas de texto por eso el resultado es el obtenido. Luego se usa "\n" lo cual crea un salto de línea. No es obligatorio pero es recomendable.
Ejemplo 2 de impresión de texto por pantalla en C++, usando cout
#include "iostream"
#include "string"
using namespace std;
int main()
{
//El valor de esta variable se mostrará en pantalla
string salida1 = "Ejemplo de salida";
//Este valor también se mostrará en pantalla.
int numero = 2;
//Estos valores se concatenarán en una única salida
string salida2 = "Desde ProgramarYa.";
//Se concatenan y muestran los valores por pantalla con cout<<
cout << salida1 << " " << numero << ". " << salida2 << "\n";
return 0;
}
En este ejemplo de salida por pantalla hemos visto que también es posible usar la instrucción cout para mostrar en pantalla el valor de las variables así sean numéricas o cadenas de texto. También vimos que podemos concatenar los valores de esas variables entre sí y también concatenarlas con otros valores directamente (espacios, puntos, símbolos, etc.).
Ahora, veamos los mismos ejemplos, pero usando la función printf de C++, la cual también es útil para imprimir valores por pantalla
Ejemplo 1 de impresión de texto por pantalla en C++, usando printf
#include "iostream"
using namespace std;
int main()
{
//Se muestra un mensaje por pantalla.
printf("Hola Mundo");
printf(" Desde ProgramarYa.");
printf("\n");
//Alternativamente
printf("Hola Mundo Desde ProgramarYa.\n");
return 0;
}
Como puedes ver, al ejecutar el código, el resultado sería el mismo del ejemplo de cout: "Hola Mundo Desde ProgramarYa", con su respectivo salto de línea al final. Sin embargo, el código es bastante diferente, pues printf no nos permite concatenar valores directamente en un solo llamado, así que debemos hacer llamadas sucesivas para imprimir cada parte del mensaje. Por supuesto, podrías simplemente hacer un solo llamado a printf con el mensaje completo y sería mucho más sencillo.
Adicionalmente, los llamados a printf requieren que los valores estén al interior de los paréntesis (), pues printf es más una función que una instrucción propia de C++.
Es cuestión de gustos, pero siempre me ha parecido que cout simplifica bastante las cosas. Veamos ahora el segundo ejemplo usando printf, porque la cosa se complica:
Ejemplo 2 de impresión de texto por pantalla en C++, usando printf
#include "iostream"
#include "string"
using namespace std;
int main()
{
string salida1 = "Ejemplo de salida"; //El valor de esta variable se mostrará en pantalla
int numero = 2; //Este valor también se mostrará en pantalla.
string salida2 = "Desde ProgramarYa."; //Estos valores se concatenarán en una única salida
//Se concatenan y muestran los valores por pantalla con parámetros de printf
printf("%s %d. %s \n", salida1.c_str(), numero, salida2.c_str());
return 0;
}
En este ejemplo usando printf, puedes ver que inicialmente todo es igual, pero al momento de imprimir, todo cambia. Cuando nec esitas pasar valores a printf, lo haces con un "%" seguido de una letra. En el caso de un string se usa s (%s) y en el caso de un número, se usa d (%d). Y luego, se pasa como una serie de argumentos, cada uno de los valores a usar en ese mismo orden.
Ahora bien, la cosa es aún más compleja en el caso de string, porque printf no soporta el uso de string, así que debemos pasar es un apuntador a una seria de char. Por suerte, eso se consigue llamando a la función "c_str()" propia de string.
Ya tenemos claro cómo mostrar texto por pantalla en C++ ahora haremos uso de este concepto y veremos cómo leer texto por teclado en C++. Veamos:
Entrada o lectura de datos en C++
Tal como mencioné hace un momento, la lectura de datos en C++ es bastante simple. Leer datos por teclado en C++ se hace usando el comando cin >> es importante notar el uso de los dos signos >> que son usados para controlar el flujo de datos. No te preocupes mucho por ellos, solo ten en cuenta que cada vez que vaya a usar la instrucción cin debes agregarle >> para quedar con un cin>>. Una manera muy sencilla de recordar esta instrucción es que in significa entrar y como estamos programando en C++ le añadimos la letra C al comienzo quedando así cin>> (sin olvidar los >>).
Veamos unos ejemplos simples para leer datos en C++. Recuerda como dije más arriba que lo ideal para leer datos es indicarle al usuario qué es lo que esperamos que ingrese por lo que en estos ejemplos usaremos también lo recién aprendido (mostrar texto por pantalla).
Ejemplo 1 de lectura de datos en C++, usando cin
#include "iostream"
#include "string"
using namespace std;
int main()
{
cout << "Hola! Este es un ejemplo en C++" << "\n" << "Por favor ingrese su nombre:" << "\n";
//La instrucción \n es un salto de línea Mostrando los textos separados
string nombre;//En esta variable estará almacenado el nombre ingresado.
cin >> nombre; //Se lee el nombre
cout << "Bienvenido al sistema " << nombre << ". Gracias por usar nuestra aplicación" << "\n";
return 0;
}
En este ejemplo hemos hecho un pequeño sistema de bienvenida personalizado para el usuario leyendo el valor por teclado de su nombre. En el comando cin>> se debe poner, después de >>, el nombre de la variable en la cual se almacenará el valor que el usuario ingrese. Por tal motivo primero se declaró una variable llamada nombre y luego se usó cin >> nombre indicando que lo que el usuario ingrese se almacenará en dicha variable.
Ahora bien, el ejemplo anterior es funcional. Sin embargo, presenta problemas para mostrar los valores, cuando el nombre que ingresas contiene espacios. Y como es muy posible que un nombre contenga espacios, debemos repararlo.
Ejemplo 1 (mejorado) para leer de datos en C++, usando getline y cin
#include "iostream"
#include "string"
using namespace std;
int main()
{
cout << "Hola! Este es un ejemplo en C++" << "\n" << "Por favor ingrese su nombre:" << "\n";
//Volvemos a mostrar el mismo mensaje, pues para mostrar datos no hay problemas
string nombre;//Seguimos usando string para almacenar el nombre
//cin >> nombre; //Esta línea da problemas si se lee un valor con espacios
// En su lugar, usamos getline, con el flujo de entrada de cin y lo asignamos as nombre
getline(cin, nombre); //Esta línea no dará problemas con los espacios en el nombre
cout << "Bienvenido al sistema " << nombre << ". Gracias por usar nuestra aplicación" << "\n";
return 0;
}
En este ejemplo hemos hecho exactamente lo mismo, pero hemos modificado el modo de leer la información desde la consola, de modo que, aunque el valor del nombre incluya espacios, no haya fallas y se use el valor completo introducido por el usuario.
Veamos ahora otro ejemplo, pero para leer números:
Ejemplo 2 de lectura de datos en C++, usando cin
#include "iostream"
#include "string"
using namespace std;
int main()
{
//Mensaje de bienvenida
cout << "Hola! Aqui podras realizar sumas" << "\n";
//Se declaran los números que se sumarán (pueden ser decimales)
float numero1, numero2;
//Se pide el primer numero
cout << "Por favor ingrese el primer valor: " << "\n";
//Se asigna el primer valor a numero1
cin >> numero1;
//Se pide el segundo numero
cout << "Por favor ingrese el segundo valor: " << "\n";
//Se asigna el segundo valor a numero2
cin >> numero2;
//Se muestra el resultado.
cout << numero1 << " + " << numero2 << " = " << numero1 + numero2;
return 0;
}
Acá tienes un caso similar al anterior, pero en esta ocasión se están solicitando números y luego realizando operaciones matemáticas con ellos.
Vamos ahora a hablar un poco del uso de scanf para leer valores y algunas dificultades que esto presenta.
Uso de scanf para leer valores y cadenas de texto (string) en C++
El operador scanf al igual que printf fueron ideados para el lenguaje C (no para C++), por lo cual su uso es más primitivo y, en cierto modo, complejo. Leer datos con scanf implica comprender un poco el concepto de punteros y particularmente en el caso de string (que es una librería de C++) se complica aún más, pues debemos convertir ese string en un array definido de caracteres (char).
Vamos a ver un único ejemplo sobre el uso de scanf y string en C++ para quedar claros acerca de estas dificultades
#include "string"
using namespace std;
int main()
{
char temporal[100];
printf("Tu nombre?\n");
scanf("%100s", temporal);
string nombre = temporal;
printf("Te doy la bienvenida %s", nombre.c_str());
return 0;
}
Como puedes ver, necesitamos seguir usando la sintaxis tipo "%s" para leer una serie de caracteres, pero en esta ocasión debimos además especificar el tamaño del mismo (100). Adicionalmente, en los siguientes argumentos de scanf, pasamos entonces el nombre de la variable a la cual asignar el valor ingresado por el usuario
Ahora, es un código un tanto curioso. Y siendo sincero, el uso de string es completamente innecesario en ese código (por desgracia). Tanto scanf como printf nos obligan a usar tipos muy primitivos, como char, así que si queremos usar string es poco lo que podemos hacer, pues aunque en nuestro código finalmente hemos usado string, en realidad se trata de un array de 100 caracteres (char) disfrazado.
El código funciona y te permitirá entonces leer valores por medio de scanf y asignarlos a una variable. Esto funciona muy bien con números, pero con string o básicamente en este caso un array de caracteres, debemos lidiar con tamaños constantes (como el 100 que tenemos allí).
Algunas recomendaciones y comentarios al leer y escribir datos en C++
- Primero que todo, aunque los puedes usar, no recomiendo para nada el uso de scanf y printf, pues complican demasiado el código y pierdes mucha flexibilidad. En realidad, tanto scanf como printf son de C y no de C++, así que deberías usar siempre cout y cin en lugar de printf y scanf (respectivamente), no tienes razones para complicarte la vida sin necesidad.
- Finalmente, recuerda siempre que cin va acompañado de ">>", mientras que cout usa "<<" (notar que van en sentido contrario). EN realidad, cin dirige el flujo de dastos hacia la variable (por ello va a la derecha ">>"), mientras que cout lo dirige hacia la salida del sistema (por eso va hacia la izquierda "<<".
- Una vez más, el uso de printf y scanf no es recomendable, porque además de ser bastante más complejos, pueden incluso acarrear a problemas de seguridad en tus programas. La complejidad de estas librerías es simplemente innecesaria en los tiempos actuales.
Muy bien eso ha sido todo en este contenido. Espero que te haya sido de muchísima utilidad. Si has comprendido todo a la perfección y no tienes problemas ni dudas, puedes continuar con la sección de Condicionales en C++ o si ya sabes condicionales puedes seguir con Ciclos en C++. Por otro lado si tienes algún problema, duda, comentario y/o sugerencia la atenderé con gusto si la publicas en la sección de comentarios. Nos leemos.
La última actualización de este artículo fue hace 4 años