Métodos de captura de datos en C++: Uso de cin, get y getline

Lectura de caracteres individuales mediante miembros de istream

En C++, el objeto cin proporciona funciones miembro para procesar la entrada de caracteres uno a uno, permitiendo un control preciso sobre el flujo, incluyendo espacios en blanco y saltos de línea.

  • get(char &ch): Lee el siguiente carácter, incluyendo espacios y tabulaciones, y lo almacena en la variable proporcionada.
  • get(void): Extrae el carácter del flujo y lo devuelve como un valor entero (su código ASCII/Unicode).

Comparativa de funciones para lectura de caracteres:

Característica cin.get(ch) ch = cin.get()
Transmisión del dato Asignación por referencia al parámetro ch Valor de retorno de la función
Resultado de la función Referencia al objeto istream Valor entero del carácter (int)
Comportamiento al final del archivo (EOF) Evalúa a false Devuelve la constante EOF

Procesamiento de cadenas con miembros de clase

Para la lectura de arreglos de caracetres (C-strings), existen dos métodos principales que se comportan de manera distinta respecto al delimitador:

  • get(char *buffer, int tamaño, char delimitador): Extrae caracteres hasta alcanzar el límite o el delimitador, pero mantiene el delimitador en el flujo de entrada.
  • getline(char *buffer, int tamaño, char delimitador): Extrae caracteres de forma similar, pero extrae y descarta el delimitador del flujo de entrada.

El siguiente ejemplo demuestra la diferencia práctica entre ambos métodos:

#include <iostream>

int main() {
    const int TAM = 100;
    char buffer[TAM];
    char residuo;

    using namespace std;

    cout << "--- Prueba con getline() ---" << endl;
    cout << "Escriba una frase terminada en '*': ";
    cin.getline(buffer, TAM, '*');
    cout << "Texto capturado: " << buffer << endl;

    cin.get(residuo);
    cout << "Siguiente caracter en el flujo: [" << residuo << "]" << endl;

    // Limpiar el flujo si no se llegó al final de la línea
    if (residuo != '\n') {
        cin.ignore(TAM, '\n');
    }

    cout << "\n--- Prueba con get() ---" << endl;
    cout << "Escriba otra frase terminada en '#': ";
    cin.get(buffer, TAM, '#');
    cout << "Texto capturado: " << buffer << endl;

    cin.get(residuo);
    cout << "Siguiente caracter en el flujo: [" << residuo << "]" << endl;

    return 0;
}

Al ejecutar este código, se observa que tras usar getline() con el delimitador '*', el siguiente carácter disponible será el que seguía inmediatamente al asterisco. En cambio, con get(), el carácter '#' permanece en el flujo y es lo primero que se lee en la siguiente operación.

El operador de extracción >>

El uso estándar de cin >> variable es el método más común, pero tiene una restricción importante: omite automáticamente los espacios en blanco, tabulaciones y saltos de línea iniciales.

char a, b;
std::cin >> a >> b;
// Si el usuario ingresa "x y", 'a' será 'x' y 'b' será 'y', ignorando el espacio intermedio.

Uso de la función global std::getline

Cuando se trabaja con la clase std::string en lugar de arreglos de caracteres, se utiliza la función global definida en la cabecera <string>. Esta función lee toda una línea hasta encontrar un salto de línea (\n), incluyéndolo en la extracción pero no en el contenido de la variable.

#include <iostream>
#include <string>

int main() {
    std::string parrafo;
    std::cout << "Ingrese una oracion con espacios: ";
    std::getline(std::cin, parrafo);
    std::cout << "Contenido almacenado: " << parrafo << std::endl;
    return 0;
}

A diferencia del operador >>, std::getline permite capturar frases completas que contienen espacios sin truncar la cadena en la primera palabra.

Etiquetas: cpp iostream cin std::string programacion-c++

Publicado el 11-3 10:51