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.