01
de 08
Una nueva forma de salida
C ++ conserva una compatibilidad hacia atrás muy alta con C, por lo que
En la lección anterior, esto fue tocado con un ejemplo que usaba cout. Aquí entraremos en un poco más de profundidad comenzando con la salida primero, ya que tiende a ser más utilizada que la entrada.
La clase iostream proporciona acceso a los objetos y métodos que necesita tanto para la salida como para la entrada. Piense en E / S en términos de flujos de bytes, ya sea yendo desde su aplicación a un archivo, la pantalla o una impresora, que es la salida, o desde el teclado, que es la entrada.
Salida con Cout
Si conoce C, puede saber que << se usa para desplazar bits a la izquierda. Por ejemplo, 3 << 3 es 24. Por ejemplo, el desplazamiento a la izquierda duplica el valor, de modo que 3 desplazamientos a la izquierda lo multiplican por 8.
En C ++, << ha sido sobrecargado en la clase ostream para que En t, flotadory tipos de cadenas (y sus variantes, p. ej. dobles) son todos compatibles. Así es como se realiza la salida de texto, al unir varios elementos entre <<.>
cout << "Some Text" << intvalue << floatdouble << endl;
Esta sintaxis peculiar es posible porque cada uno de los << es en realidad una llamada a función que devuelve un referencia a una corriente de aire objeto. Entonces, una línea como la anterior es realmente así
cout. << ("algún texto"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl);
La C funciónprintf pudo formatear la salida usando Especificadores de formato como% d. En C ++, cout también puede formatear la salida, pero utiliza una forma diferente de hacerlo.
02
de 08
Usando Cout para dar formato a la salida
El objeto cout es un miembro de la iostream biblioteca. Recuerde que esto debe incluirse con un
#incluir
Esta biblioteca iostream se deriva de ostream (para salida) y istream para entrada.
Formateo de la salida de texto se realiza insertando manipuladores en la secuencia de salida.
¿Qué es un manipulador?
Es una función que puede alterar las características de la secuencia de salida (y entrada). En la página anterior vimos que << era una función sobrecargada que devolvía una referencia al objeto invocador, p. cout para salida o cin para entrada. Todos los manipuladores hacen esto para que pueda incluirlos en la salida << o entrada >>. Vamos a ver la entrada y >> Más adelante en esta lección.
contar << endl;
endl es un manipulador que termina la línea (y comienza una nueva). Es una función que también se puede llamar de esta manera.
endl (cout);
Aunque en la práctica no harías eso. Lo usas así.
cout << "Algún texto" << endl << endl; // Dos líneas en blanco.
Los archivos son solo secuencias
Algo a tener en cuenta que con mucho desarrollo en estos días se está haciendo en GUI aplicaciones, ¿por qué necesitaría funciones de E / S de texto? ¿No es eso solo por consola aplicaciones? Bueno, probablemente haga E / S de archivos y también puede usarlos allí, pero también lo que se genera en la pantalla generalmente también necesita formatearse. Las transmisiones son una forma muy flexible de manejar entradas y salidas y pueden funcionar con
- Texto de E / S. Como en las aplicaciones de consola.
- Instrumentos de cuerda. Práctico para formatear.
- Archivo de E / S.
Manipuladores de nuevo
Aunque hemos estado usando el ostream clase, es una clase derivada desde el ios clase que deriva de la ios_base. Esta clase ancestral define al público. funciones que son manipuladores
03
de 08
Lista de manipuladores de Cout
Los manipuladores se pueden definir en flujos de entrada o salida. Estos son objetos que devuelven una referencia al objeto y se colocan entre pares de <<. La mayoría de los manipuladores se declaran en, pero endl, termina y rubor viene de
Aquí hay una lista más detallada.
Desde
- endl: finaliza la línea y llama al vaciado.
- termina - Inserta '\ 0' ( NULO) en la corriente.
- flush: obliga al búfer a salir inmediatamente.
Desde . La mayoría se declaran en
- boolalpha: inserta o extrae objetos bool como "verdadero" o "falso".
- noboolalpha: inserta o extrae objetos bool como valores numéricos.
- fixed - Insertar valores de punto flotante en formato fijo.
- científico: inserta valores de punto flotante en formato científico.
- internal - Justificación interna
- left - Justificar a la izquierda.
- right - Justificar a la derecha.
- dec: inserta o extrae valores enteros en formato decimal.
- hex: inserta o extrae valores enteros en formato hexadecimal (base 16).
- oct: inserta o extrae valores en formato octal (base 8).
- noshowbase: no prefije el valor con su base.
- showbase: valor del prefijo con su base.
- noshowpoint: no muestra el punto decimal si no es necesario.
- showpoint: muestra siempre el punto decimal al insertar valores de punto flotante.
- noshowpos: no inserte el signo más (+) si número> = 0.
- showpos: inserte el signo más (+) si número> = 0.
- noskipws: no omita el espacio en blanco inicial al extraer.
- skipws: omite el espacio en blanco inicial al extraer.
- nouppercase: no reemplace letras minúsculas por equivalentes mayúsculas.
- mayúsculas - Reemplazar letras minúsculas por equivalentes mayúsculas.
- unitbuf - Vaciar el búfer después de una inserción.
- nounitbuf: no vacíe el búfer después de cada inserción.
04
de 08
Ejemplos de uso de Cout
// ex2_2cpp. #include "stdafx.h" #incluirusando el espacio de nombres estándar; int main (int argc, char * argv []) { cout.width (10); cout << derecha << "Prueba" << endl; cout << izquierda << "Prueba 2" << endl; cout << interno << "Prueba 3" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << mayúscula << "David" << endl; cout.precision (8); cout << científico << endl; cout << 450678762345.123 << endl; cout << fijo << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: mayúsculas); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; devuelve 0; }
El resultado de esto está abajo, con uno o dos espacios de línea adicionales eliminados para mayor claridad.
Prueba. Prueba 2. Prueba 3. 46. David 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234.
Nota: A pesar de las mayúsculas, David se imprime como David y no como DAVID. Esto se debe a que las mayúsculas solo afectan la salida generada, p. números impresos en hexadecimal. Entonces, la salida hexadecimal 4d2 es 4D2 cuando mayúscula está en funcionamiento.
Además, la mayoría de estos manipuladores en realidad establecen un poco en una bandera y es posible configurar esto directamente con
cout.setf ()
y limpiarlo con
cout.unsetf ()
05
de 08
Uso de Setf y Unsetf para manipular el formato de E / S
La función setf tiene dos sobrecargado versiones que se muestran a continuación. Mientras unsetf solo borra los bits especificados.
setf (valores de bandera); setf (valores de bandera, valores de máscara); unsetf (valores de bandera);
Los indicadores variables se derivan por ORing juntos todos los bits que quieras con |. Entonces si quieres científica, mayúscula y boolalpha entonces usa esto. Solo los bits pasaron como parámetro se establecen. Los otros bits se dejan sin cambios.
cout.setf (ios_base:: científica | ios_base:: mayúscula | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; valor bool = verdadero; cout << valor << endl; cout.unsetf (ios_base:: boolalpha); cout << valor << endl;
Produce
4D2. 1.234000E + 011. cierto. 1.
Bits de enmascaramiento
Los dos parámetro La versión de setf usa una máscara. Si el bit se establece tanto en el primer como en el segundo parámetro, se establece. Si el bit está solo en el segundo parámetro, se borra. Los valores ajustarfield, campo base y Floatfield (enumerados a continuación) son indicadores compuestos, es decir, varios indicadores Or'd juntos. por campo base con los valores 0x0e00 es lo mismo que dic | oct | maleficio. Entonces
setf (ios_base:: hex, ios_basefield);
borra las tres banderas y luego establece maleficio. similar ajustar campo es izquierda | derecho | interno y Floatfield es científica | fijo.
Lista de bits
Esta lista de enumeraciones está tomada de Microsoft Visual C ++ 6.0. Los valores reales utilizados son arbitrarios: otro compilador puede usar valores diferentes.
skipws = 0x0001. unitbuf = 0x0002. mayúscula = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. izquierda = 0x0040. derecha = 0x0080. interno = 0x0100. dec = 0x0200. oct = 0x0400. hex = 0x0800. científico = 0x1000. fijo = 0x2000. boolalpha = 0x4000. ajustecampo = 0x01c0. campo base = 0x0e00, campo flotante = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
de 08
Sobre Clog y Cerr
Me gusta cout, obstruir y cerr son objetos predefinidos definidos en ostream. La clase iostream hereda de ambos ostream y istream así que por eso el cout ejemplos pueden usar iostream.
Con y sin búfer
- Buffer: toda la salida se almacena temporalmente en un buffer y luego volcado a la pantalla de una vez. Tanto cout como atascos están almacenados temporalmente.
- Sin búfer: toda la salida va inmediatamente al dispositivo de salida. Un ejemplo de un objeto sin búfer es cerr.
El siguiente ejemplo demuestra que cerr se usa de la misma manera que cout.
#incluir usando el espacio de nombres estándar; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Error" << endl; devuelve 0; }
El principal problema con el almacenamiento en búfer es si el programa se bloquea, entonces el contenido del búfer se pierde y es más difícil ver por qué se bloqueó. La salida sin búfer es inmediata, por lo que rociar algunas líneas como esta a través del código podría ser útil.
cerr << "Entrando en la función peligrosa zappit" << endl;
El problema de registro
Crear un registro de eventos del programa puede ser una forma útil de detectar errores difíciles, el tipo que solo ocurre de vez en cuando. Sin embargo, si ese evento es un bloqueo, tiene el problema: ¿vacia el registro al disco después de cada llamada para poder ver los eventos? hasta el choque o manténgalo en un búfer y vacíe periódicamente el búfer y espere que no pierda demasiado cuando el choque ¿ocurre?
07
de 08
Uso de Cin para entrada: entrada formateada
Hay dos tipos de entrada.
- Formateado Lectura de entrada como números o de cierto tipo.
- Sin formato Lectura de bytes o instrumentos de cuerda. Esto proporciona un control mucho mayor sobre el flujo de entrada.
Aquí hay un ejemplo simple de entrada formateada.
// excin_1.cpp: define el punto de entrada para la aplicación de consola. #include "stdafx.h" // solo Microsoft. #incluir usando el espacio de nombres estándar; int main (int argc, char * argv []) { int a = 0; flotador b = 0.0; int c = 0; cout << "Ingrese un int, un flotante y un int separados por espacios" <> a >> b >> c; cout << "Usted ingresó" << a << "" << b << "" << c << endl; devuelve 0; }
Esto usa cin para leer tres números (En t, flotador, int) separados por espacios. Debe presionar enter después de escribir el número.
3 7.2 3 generará "Usted ingresó 3 7.2 3".
¡La entrada formateada tiene limitaciones!
Si ingresa 3.76 5 8, obtiene "Ingresó 3 0.76 5", todos los demás valores en esa línea se pierden. Eso se está comportando correctamente, como el. no es parte de int y, por lo tanto, marca el inicio del flotador.
Captura de errores
El objeto cin establece un bit de error si la entrada no se convirtió correctamente. Este bit es parte de ios y se puede leer mediante el uso de fallar() funcionar en ambos cin y cout Me gusta esto.
if (cin.fail ()) // haz algo.
No es sorprendente, cout.fail () rara vez se establece, al menos en la salida de la pantalla. En una lección posterior sobre E / S de archivo, veremos cómo cout.fail () puede hacerse realidad También hay una bueno() función para cin, cout etc.