Stream formato con i / o 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 para que los enteros aparecen en la pantalla como valores hexadecimales en lugar de valores como decimales:
ios :: fmtflags prev = cout.setf (ios :: hexagonal, ios :: basefield) -
Aquí el setf () método establece las banderas de formato por primera 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:
#includeusing namespace std - // displayHex - mostrar un número en hexadecimal formatvoid displayHex (ostream cabo, int n) {ios :: fmtflags prev = out.setf (ios :: hexagonal, ios :: basefield) salida privado lt; lt; n-out.setf (prev) -} int main () {int n = 0x1234-cout lt; lt; "n =" lt; lt; n lt; lt; endl-cout lt; lt; "n en hexadecimal es" -displayHex (cout, n) -cout lt; lt; endl retorno 0-}
El programa comienza estableciendo la variable n a un valor hexadecimal. A continuación, muestra el valor de cout. A continuación, llama al 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 n.
Sin embargo, C ++ proporciona una segunda forma de controlar I / O Formato: manipuladores de E / S.
¿Qué es un manipulador de E / S?
Un I / O manipulador es un objeto que el programador puede insertar en el flujo de salida para invocar las funciones de control de formato. El siguiente fragmento de código muestra el usuario de manipuladores de E / S. Realiza la misma función que el fragmento anterior, excepto que esta versión utiliza un manipulador de E / S para invocar el setf () función:
#include#include using namespace std-int main () {int n = 0x1234-cout lt; lt; "n =" lt; lt; n lt; lt; endllt; lt; "n en hexadecimal es" lt; lt; SETBASE (16) lt; lt; n lt; lt; endl retorno 0-}
Aquí main () 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) a 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.
Para hexadecimal, octal y decimal, C ++ proporciona los accesos directos maleficio, octubre y diciembre lo que significa que el código podría adoptar la siguiente forma aún más corto:
cout lt; lt; "n =" lt; lt; n lt; lt; endllt; lt; "n en hexadecimal es" lt; lt; maleficio lt; lt; n lt; lt; endl-
Qué manipuladores de E / S no C ++ ofrece?
Echa un vistazo a esta tabla, que contiene una lista de los manipuladores de E / S disponibles en C ++ 2011.
E / S Manipulador | Función |
---|---|
boolalpha noboolalpha | Cambia entre textual y pantalla numérica de un booleano. Cuandoboolalpha se establece, verdadero y falso appearonscreen como 'cierto' y 'falso'. Cuando no se establece, aparecen como '1'Y' 0 '. |
showbase noshowbase | Cuando showbase se establece, octal valuesare precedida por una 0 y hexadecimalvalues son precedidos por '0x' o '0X'. |
showpoint noshowpoint | Un punto decimal siempre se muestra cuando showpoint se establece. |
showpos noshowpos | Muestra una '+' sesión valores delanteros ofpositive cuando showpos es set.Displays nada cuando noshowpos isset. |
skipws noskipws | Omite líder espacio en blanco en la entrada. |
mayúscula nouppercase | Si mayúscula se establece, entonces useuppercase de formatos de salida, por ejemplo, '0X'Para la salida hexadecimal. Si nouppercase se establece, utilice minúsculas, por ejemplo,'0x'Para la salida hexadecimal. |
unitbuf nounitbuf | Si se activa, la salida no es amortiguada pero se sonrojó después eachinsert. Si no se establece, la salida es amortiguada. |
fijo científico | Salida Conjunto de valores de punto flotante a la notación orscientific fijo. |
ws | Este objeto se come el espacio en blanco de un flujo de entrada. |
extremos | Inserta un carácter nulo (' 0') En un OutputStream. Útil para nulo de terminación de una cadena al utilizar ostrstream. |
rubor | Vacía los caracteres de amortiguamiento con la corriente de salida. |
endl | Inserta un carácter de nueva línea. |
setiosflags(n) resetiosflags(n) | Establecer o borrar la ios banderas enmasse. |
SETBASE (n) | Establece la base para la entrada y salida de número entero de 8, 10, 16 o texto 0.See para la explicación de 0. |
diciembre octubre maleficio | Establecer la base a decimal, octal o hexadecimal. Taquigrafía para SETBASE (10), SETBASE (8), y SETBASE (16), respectivamente. |
setfill (c) | Define el carácter utilizado para llenar el espacio cuando el número ofcharacters para mostrar es menor que el ancho del campo. El defaultcharacter es un espacio. |
setprecision (n) | Establece el número de dígitos a la salida cuando se muestra el número afloating puntos. |
setw (n) | Establece el ancho mínimo del campo de salida siguiente. El campo con IsExpanded setfill () personajes asnecessary. |
setfill (c) | Define el carácter utilizado para llenar el espacio cuando el número ofcharacters para mostrar es menor que el ancho del campo. El defaultcharacter es un espacio. |
interna izquierda derecho | Ajuste la colocación de los caracteres de relleno. Si el characterwere relleno '*' (por ejemplo), entonces: interna -"$ 123.00 **" izquierda - "** $ 123.00" derecho - "$ 123.00 **" |
obtener dinero() put_money () | Leer o mostrar un valor monetario, utilizando las reglas locales como escenario Fijado. (Esto no está implementado en la versión actual ofgcc.) |
get_time () put_time () | Lea o mostrar una hora o fecha, utilizando las reglas locales como conjunto bylocale. (Esto no está implementado en la versión actual ofgcc.) |
La mayor parte de los manipuladores son sencillos. Algunos requieren alguna explicación, sin embargo. Por ejemplo, con respecto a la SETBASE () manipulador, no se admiten 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, establecer la base de 0 - de hecho, 0 es el valor predeterminado.
Configuración de la base a 0 es lo mismo que establecer que 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-42 un número comienza con 0x o 0X, se supone # ser hexadecimal.
Si-42 un número comienza con sólo 0, entonces se asume # ser octal.
# 42-En otro caso el número se supone que es decimal.
El siguiente sencillo programa demuestra las siguientes reglas:
#include#include using namespace std-int main () {int n1, n2, n3-cin >> SETBASE (0) >> >> n1 n2 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 la cin oponerse a 0 y luego extrae tres enteros. La segunda línea muestra estos tres enteros en formato hexadecimal. los showbase manipulador hace que el líder '0x' que se mostrará a los valores hexadecimales. A continuación se muestra un ejemplo de ejecución de este programa, donde los tres números en negrita son los valores que la 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. La tercera y última serie fue interpretado como 10 en hexadecimal.
Otro manipulador que merece especial mención es la setw (), abreviatura de "ancho de ajuste". Esto establece el ancho de la pantalla mínima de campo siguiente muestra. El siguiente sencillo programa muestra cómo setw ()interactúa con el acolchado y el carácter de relleno:
#include#include using namespace std-int main () {int ancho-int valor cout lt; lt; "Introduzca el ancho:" - cin >> anchura cout lt; lt; setfill ('*') - para (-) {cout lt; lt; "Introduzca un valor:" - cin >> valor si (valor == 0) {} desglose 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; interna lt; lt; setw (ancho) lt; lt; valor lt; lt; endl-} return 0-}
Este programa establece el carácter de relleno a '*' (el valor predeterminado es el espacio). A continuación, lee la anchura que se utilizará 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 con la izquierda; relleno mano y luego con la derecha; relleno lado, y finalmente con relleno interno.
El siguiente es un ejemplo de ejecución del programa con la entrada en negrita:
Introduzca el ancho:5Introduzca un valor de:100000Izquierda, Derecha e Interno: 100000, 100000, 100000Enter un valor:100Izquierda, Derecha e Interno: 100 **, ** 100 **, 100Enter un valor:-100Izquierda, Derecha e Interno: -100 *, * -100, - * 100Enter un valor:0
Aquí 5 se introduce como la anchura 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. El ancho establecido sólo establece el ancho mínimo para mostrar.
El siguiente valor introducido, 100, requiere solamente tres columnas para mostrar, por lo que el programa muestra el valor primero con de 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 derecho puso el carácter de relleno a la izquierda del valor, incluyendo el signo menos. Relleno Interna 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 con el showpos manipulador y entre el número y el signo de dinero (cuando la moneda está respaldada 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 llamando a un método público en el objeto de secuencia. Sin embargo, sí proporcionan un medio conveniente para el formateo de E / S.