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()
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.
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.