Stream formatear la e / s manipuladores

Una de las dificultades con C ++ en movimiento para transmitir objetos para la salida es aprender cómo dar formato a la salida. En realidad, hay dos maneras de dar formato de la corriente de E / S.

La primera técnica que los programadores normalmente aprenden es a través de llamadas a métodos directos. Por ejemplo, la siguiente llamada establece la corriente de salida en modo hexadecimal de modo que los enteros aparecen en la pantalla como valores hexadecimales en lugar de valores decimales como:

ios :: fmtflags prev = cout.setf (ios :: hex, ios :: basefield) -

Aquí el setf () método establece las banderas de formato por primera el enmascaramiento de los bits en el segundo argumento, y luego poner los bits indicados por el primer argumento. La función devuelve el valor anterior de manera que la función de llamada puede restaurar las banderas de formato antes de regresar.

En la práctica, esta función aparece como sigue:

#incluir using namespace std - // displayHex - mostrar un número en hexadecimal formatvoid displayHex (ostream& fuera, int n) {ios :: fmtflags prev = out.setf (ios :: hex, ios :: basefield) salida privado lt; lt; n-out.setf (prev) -} int main () {int n = 0x1234-cout lt; lt; "n = " lt; lt; norte lt; lt; endl-cout lt; lt; "n en hexadecimal es "-displayHex (cout, n) -cout lt; lt; endl retorno 0-}

El programa se inicia estableciendo la variable norte a un valor hexadecimal. A continuación, muestra el valor a cout. A continuación, llama la displayHex () función para visualizar el valor en formato hexadecimal. La salida del programa aparece como sigue:

n = 4660n en hexadecimal es 1234

El valor en formato decimal no es reconocible, pero la pantalla hexadecimal es claramente el valor que se utiliza para inicializar norte.

Sin embargo, C ++ proporciona una segunda forma de control de E / formato O: manipuladores de E / S.

¿Qué es un manipulador de E / S?

Un I / O manipulador es un objeto que el programador puede insertar en la secuencia de salida para invocar las funciones de control de formato. El siguiente fragmento de código se muestra al usuario de los manipuladores de E / S. Se realiza la misma función que el fragmento anterior, excepto que esta versión utiliza un manipulador I / O para invocar el setf () función:

#incluir #incluir usando espacio de nombres std-int main () {int n = 0x1234-cout lt; lt; "n = " lt; lt; norte lt; lt; endllt; lt; "n en hexadecimal es " lt; lt; SETBASE (16) lt; lt; norte lt; lt; endl retorno 0-}

aquí principal() primero salidas n como un valor decimal. A continuación, utiliza la SETBASE (16) manipulador para cambiar la base de la pantalla de decimal (base 10) para hexadecimal (base 16) antes de mostrar el valor de nuevo. La salida de esta versión es indistinguible de la versión anterior:

n = 4660n en hexadecimal es 1234

los SETBASE (16) objeto aparece como una llamada a una función en el medio de la corriente de salida. El hecho de que se está creando un objeto es invisible para el usuario.

Video: How did Hitler rise to power? - Alex Gendler and Anthony Hazard

Para hexadecimal, octal y decimal, C ++ proporciona los accesos directos maleficio, oct y dic lo que significa que el código podría adoptar la siguiente forma aún más corto:

cout lt; lt; "n = " lt; lt; norte lt; lt; endllt; lt; "n en hexadecimal es " lt; lt; maleficio lt; lt; norte lt; lt; endl-

Lo manipuladores de E / S no C ++ ofrece?

Echar un vistazo a esta tabla, que contiene una lista de los manipuladores de E / S disponibles en C ++ 2011.

Me común / S Manipuladores
I / O ManipuladorFunción
boolalpha noboolalphaCambia entre textual y pantalla numérica de un booleano. Cuando
boolalpha se establece, parece verdadero y falso
pantalla como cierto y falso. Cuando no se establece, aparecen como 1 y ‘0’.
showbase noshowbaseCuando showbase se fija, valores octales
están precedidas por una 0 y hexadecimal
los valores son precedidos por 0x o 0X.
showpoint noshowpointUn punto decimal siempre aparece cuando showpoint se establece.
showpos noshowposMuestra una + firmar delante de
valores positivos cuando showpos se establece.
Muestra nada cuando noshowpos es
conjunto.
skipws noskipwsOmite que conduce el espacio en blanco en la entrada.
mayúscula nouppercaseSi mayúscula se establece, a continuación, utilizar
mayúsculas para los formatos de salida, por ejemplo, 0X para la salida hexadecimal. Si nouppercase se establece, el uso minúsculas, por ejemplo,
0x para la salida hexadecimal.
unitbuf nounitbufSi se establece, entonces la salida no es amortiguada pero limpie después de cada
insertar. Si no se establece de salida se almacena temporalmente.
fijo científicoPonga la salida de los valores de punto flotante a fijo o
notación cientifica.
wsEste objeto se come espacio en blanco de un flujo de entrada.
extremosInserta un carácter nulo () En una salida
corriente. Útil para nulo de terminación de una cadena cuando se utiliza ostrstream.
enjuagarAlinea los caracteres de amortiguamiento con la corriente de salida.
endlInserta un carácter de nueva línea.
setiosflags(norte)
resetiosflags(norte)
Establecer o borrar la ios banderas ES
masa.
SETBASE (n)Establece la base para la entrada y salida de número entero de 8, 10, 16 o 0.
Véase el texto para la explicación de 0.
dic oct maleficioEstablecer la base a decimal, octal o hexadecimal.
abreviatura de SETBASE (10), SETBASE (8), y SETBASE (16), respectivamente.
setfill (c)Define el carácter utilizado para llenar el espacio cuando el número de
caracteres para mostrar es menor que el ancho de campo. El valor por defecto
personaje es un espacio.
setprecision (n)Establece el número de dígitos a la salida cuando se visualiza una
número de coma flotante.
setw (n)Establece el ancho mínimo del siguiente campo de salida. El campo es
ampliado con setfill () personajes como
necesario.
setfill (c)Define el carácter utilizado para llenar el espacio cuando el número de
caracteres para mostrar es menor que el ancho de campo. El valor por defecto
personaje es un espacio.
interno izquierda derechoAjuste la colocación de caracteres de relleno. Si el carácter de relleno
eran ‘*’ (por ejemplo), entonces:
interno
** $ 123.00izquierda ** $ 123.00derecho $ 123.00 **
obtener dinero() Pon dinero()Leer o mostrar un valor monetario, utilizando las reglas locales tal como se
según la localidad. (Esto no está implementado en la versión actual de
gcc).
consigue tiempo() put_time ()Leer o mostrar una hora o fecha, usando las reglas locales según lo establecido por
lugar. (Esto no está implementado en la versión actual de
gcc).

La mayor parte de los manipuladores son sencillos. Algunos requieren alguna explicación, sin embargo. Por ejemplo, con respecto a la SETBASE () manipulador, no son compatibles todos los valores de base. De hecho, C ++ sólo admite decimal, octal y hexadecimal de E / S - lo cual es bueno, ya que es más o menos todo lo que se requiere. Puede, sin embargo, configurar la base a 0 - de hecho, 0 es el valor predeterminado.

Configuración de la base a 0 es lo mismo que establecer a decimal para la salida. Para la entrada, sin embargo, el establecimiento de la base a 0 significa “extraer la base del número en sí”. Las reglas para hacerlo son los siguientes:

  • * Si un número comienza con 0x o 0X, que se supone que es hexadecimal.

  • * Si un número comienza con sólo 0, entonces se asume que es octal.

  • * De lo contrario el número se supone que es decimal.

El siguiente sencillo programa muestra las siguientes reglas:

#incluir #incluir usando espacio de nombres std-int main () {int n1, n2, n3-cin gt; gt; SETBASE (0) gt; gt; n1 gt; gt; n2 gt; gt; n3-cout lt; lt; showbase lt; lt; SETBASE (16) lt; lt; "n1 = " lt; lt; n1 lt; lt; ", = n2 " lt; lt; n2lt; lt; ", = n3 "lt; lt; n3 lt; lt; endl retorno 0-}

La primera línea establece la base para el cin oponerse a 0 y luego extrae tres enteros. La segunda línea muestra estos tres enteros en formato hexadecimal. los showbase hace que el manipulador líder 0x que se mostrará para valores hexadecimales. A continuación se muestra una ejecución ejemplo de este programa, donde los tres números en negrita son valores que I entrada desde el teclado:

10 010 0x10n1 = 0xa, n2 = 0x8, n3 = 0x10

Se puede ver que el primer número se interpreta como 10 en la base 10, que es 0xA en hexadecimal. El segundo número se interpretó como 10 en la base 8, que es 8 en hexadecimal. El tercer y último número se interpretó como 10 en hexadecimal.

Otro manipulador que merece mención especial es el setw (), la abreviatura de “anchura set”. Esto establece el ancho de la pantalla mínimo del siguiente campo visualizado. El siguiente sencillo programa muestra cómo setw ()interactúa con el acolchado y el carácter de relleno:

#incluir #incluir usando espacio de nombres std-int main () {int anchura-int valor-cout lt; lt; "Introduzca el ancho:"-cin gt; gt; anchura-cout lt; lt; setfill ( `*`) - para (-) {cout lt; lt; "Introducir los valores:"-cin gt; gt; valor-Si (valor == 0) {Break-} cout lt; lt; "Izquierda, Derecha e interno: n"lt; lt; izquierda lt; lt; setw (ancho) lt; lt; valor lt; lt; ", "lt; lt; rightlt; lt; setw (ancho) lt; lt; valor lt; lt; ", "lt; lt; interno lt; lt; setw (ancho) lt; lt; valor lt; lt; endl-}} retorno 0-

Este programa establece el carácter de relleno a * (El valor predeterminado es el espacio). A continuación, lee el ancho a ser utilizado para todos los números desde el teclado antes de entrar en un bucle que lee y muestra valores. Dentro de este bucle, el programa muestra por primera vez el número de izquierda; llenado mano, luego con la derecha; llenado mano, y finalmente con relleno interno.

Video: ♥♥ The Best Fireplace Video (3 hours)

La siguiente es una muestra de la ejecución del programa, con la entrada en negrita:

Introduzca el ancho:5Introducir los valores:100000Izquierda, Derecha e interna: 100000, 100000, 100000Enter un valor:100Izquierda, Derecha e interna: 100 **, ** 100 **, 100Enter un valor:-100Izquierda, Derecha e interna: -100 *, * -100, - * 100Enter un valor:0

Aquí 5 se introduce como el ancho del campo. Sin embargo, el primer valor introducido, 100.000, requiere más de 5 columnas para mostrar lo que ninguno de los campos de visualización tuvo ningún efecto. La anchura conjunto sólo establece la anchura mínima para mostrar.

El siguiente valor introducido, 100, requiere solamente tres columnas para mostrar, por lo que el programa mostrará el valor primero con dos * caracteres a la derecha, luego a la izquierda, y otra vez a la izquierda.

El siguiente valor introducido, -100, demuestra la diferencia entre la derecha y relleno de relleno interno. relleno de la derecha puso el carácter de relleno a la izquierda del valor, incluyendo el signo menos. relleno interno puso el carácter de relleno entre el valor y el signo menos. Esto también funciona para un signo más cuando además se ve obligado en el showpos manipulador y entre el número y el signo de dinero (cuando la moneda está soportado por el compilador).

Los manipuladores no añaden ninguna capacidad que no está ya presente. Después de todo, cada uno de estos manipuladores termina de llamar a un método público en el objeto de secuencia. Sin embargo, proporcionan un medio conveniente de formato I / O.

Artículos Relacionados