cpp-entrada-y-salida-consola

Entrada y salida de consola en C++

La entrada y salida por consola (o I/O por consola) se refiere a la interacción entre un programa y el usuario a través de la línea de comandos.

En C++, esto se logra utilizando flujos de entrada y salida proporcionados por la biblioteca estándar.

ComandoConceptoDescripción
std::cinEntradaRecibir datos desde la entrada estándar (generalmente el teclado).
std::coutSalidaEnviar datos a la salida estándar (generalmente la pantalla).
std::cerrErrorEnviar mensajes de error a la salida estándar de errores.
std::clogAdvertenciasSimilar a std::cerr, pero se utiliza para mensajes de advertencia.

Entrada de datos

std::cin es el objeto de flujo de entrada estándar en C++. Permite leer datos desde la entrada estándar y se usa comúnmente para leer valores introducidos por el usuario a través del teclado.

Para leer datos de std::cin, se utiliza el operador de extracción (>>):

#include <iostream>

int main() {
    int number;
    std::cout << "Introduce un número entero: ";
    std::cin >> number;
    std::cout << "El número introducido es: " << number << std::endl;
    return 0;
}

En este ejemplo,

  • El programa solicita al usuario que introduzca un número entero.
  • std::cin >> number; lee el valor introducido por el usuario
  • Lo almacena en la variable number.

Lectura de cadenas de texto

Para leer cadenas de texto, puedes utilizar std::cin junto con el operador de extracción:

#include <iostream>
#include <string>

int main() {
    std::string name;
    std::cout << "Introduce tu nombre: ";
    std::getline(std::cin, name);  // Lee toda la línea de entrada
    std::cout << "Hola, " << name << "!" << std::endl;
    return 0;
}

En este caso, std::getline(std::cin, name); se utiliza para leer una línea completa de texto, permitiendo que el usuario introduzca nombres que contengan espacios.

Manejo de errores

Cuando se introducen datos que no son del tipo esperado, std::cin puede entrar en un estado de error. Puedes verificar y manejar estos errores utilizando el estado de flujo:

#include <iostream>

int main() {
    int number;
    std::cout << "Introduce un número entero: ";
    
    while (!(std::cin >> number)) {
        std::cin.clear(); // Limpiar el estado de error
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Ignorar la entrada incorrecta
        std::cout << "Entrada inválida. Por favor, introduce un número entero: ";
    }
    
    std::cout << "El número introducido es: " << number << std::endl;
    return 0;
}

En este código,

  • std::cin.clear() se utiliza para limpiar el estado de error del flujo
  • std::cin.ignore() se utiliza para descartar la entrada incorrecta.

Salida de datos

std::cout es el objeto de flujo de salida estándar en C++. Se utiliza para mostrar datos en la consola y se usa comúnmente para enviar información al usuario.

Para enviar datos a std::cout, se utiliza el operador de inserción (<<):

#include <iostream>

int main() {
    std::cout << "Hola, Mundo!" << std::endl;
    return 0;
}

Aquí, std::cout << "Hola, Mundo!" << std::endl; envía el texto “Hola, Mundo!” a la consola, seguido de un salto de línea (std::endl).

Formateo de salida

Puedes formatear la salida utilizando manipuladores de flujo:

#include <iostream>
#include <iomanip> // Para manipuladores de formato

int main() {
    double pi = 3.14159;
    std::cout << "Valor de Pi: " << std::fixed << std::setprecision(2) << pi << std::endl;
    return 0;
}

En este ejemplo,

  • std::fixed y std::setprecision(2) se utilizan para controlar el formato del número flotante, mostrando dos decimales.

Manipuladores de flujo

Además de std::fixed y std::setprecision, hay otros manipuladores útiles:

ComandoDescripción
std::setw(n)Establece el ancho del campo para la salida.
std::leftAlinea la salida a la izquierda.
std::rightAlinea la salida a la derecha.
std::hexCambia la base numérica de la salida a hexadecimal.
std::octCambia la base numérica de la salida a octal.
std::decCambia la base numérica de la salida a decimal.
#include <iostream>
#include <iomanip>

int main() {
    int number = 255;
    std::cout << "Decimal: " << number << std::endl;
    std::cout << "Hexadecimal: " << std::hex << number << std::endl;
    std::cout << "Octal: " << std::oct << number << std::endl;
    return 0;
}

Errores y advertencias

Errores

std::cerr se utiliza para la salida de errores. A diferencia de std::cout, std::cerr no está asociado con el buffer de salida, por lo que los mensajes de error se muestran inmediatamente.

#include <iostream>

int main() {
    std::cerr << "Este es un mensaje de error." << std::endl;
    return 0;
}

Advertencias

std::clog es similar a std::cerr, pero generalmente se usa para mensajes de log y advertencias. Su salida puede ser redirigida a diferentes lugares.

#include <iostream>

int main() {
    std::clog << "Este es un mensaje de log." << std::endl;
    return 0;
}

Ejemplos prácticos