5.2.3. Entrada orientada a líneas

Para recoger la entrada de línea en línea, tiene tres opciones:

La función miembre get()

La función miembro getline()

La función global getline() definida en la cabecera <string>

Las primeras dos funciones toman tres parámentros:

Un puntero a un buffer de carácters donde se guarda el resultado.

El tamaño de este buffer (para no sobrepasarlo).

El carácter de finalización, para conocer cuando parar de leer la entrada.

El carácter de finalización tiene un valor por defecto de '\n', que es el que usted usará usualmente. Ambas funciones almacenan un cero en el buffer resultante cuando encuentran el caracter de terminación en la entrada.

Entonces, ¿cual es la diferencia? Sutil pero importante: get() se detiene cuando vee el delimitador en el stream de entrada, pero no lo extrae de stream de entrada. Entonces, si usted hace otro get() usando el mismo delimitador, retornará inmediatamente sin ninguna entrada contenida. (Presumiblemente, en su lugar usará un delimitador diferente en la siguiente sentencia get() o una función de entrada diferente.) La función getline(), por el contrario, extrae el delimitador del stream de entrada, pero tampoco lo almacena en el buffer resultante.

La función getline() definida en <string> es conveniente. No es una función miembro, sino una función aislada declarada en el espacio de nombres std. Sólo toma dos parámetros que no son por defecto, el stream de entrada y el objeto string para rellenar. Como su propio nombre dice, lee carácteres hasta que encuentra la primera aparición del delimitador ('\n' por defecto) y consume y descarta el delimitador. La ventaja de esta función es que lo lee dentro del objeto string, así que no se tiene que preocuparse del tamaño del buffer.

Generalmente, cuando esta procesando un fichero de texto en el que usted quiere leer de línea en línea, usted querra usar una de las funciones getline(). Versiones sobrecargadas de get()

Versiones sobrecargadas de get()

La función get() también viene en tres versiones sobrecargadas: una sin argumentos que retorna el siguiente carácter usando un valor de retorno int; una que recoge un carácter dentro de su argumento char usando una referencia; y una que almacena directamente dentro del buffer subyacente de otro objeto iostream. Este último se explora después en el capítulo.

Leyendo bytes sin formato

Si usted sabe exactamente con que esta tratando y quiere mover los bytes directamente dentro de una variable, un array, o una estructura de memoria, puede usar la función de E/S sin formatear read(). El primer argumento para esta función es un puntero a la destinación en memoria, y el segundo es el número de bytes para leer. Es especialmente útil su usted ha almacenado previamente la información a un fichero, por ejemplo, en formato binario usando la función miembro complementaria write() para el stream de salida (usando el mismo compilador, por supuesto). Verá ejemplos de todas estas funciones más adelante.