contenido de la lecciÓn 6 flujo de salida estandar en …azul2.bnct.ipn.mx/c/fundamentos/archivos...

58
MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 6 6-1 CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN C++ 1. INTRODUCCIÓN 3 2. FLUJOS 3 2.1. Archivos de encabezado de la biblioteca iostream 4 2.2. Clases y objetos de flujo de entrada/salida 5 3. FLUJO DE SALIDA 7 3.1. Operador de inserción de flujo 7 3.1.1. Ejemplos 6.1, 6.2 7 3.2. Cascada del operador de inserción de flujo 8 3.2.1. Ejemplo 6.3 9 3.3. Uso de caracteres especiales 9 3.3.1. Ejemplos 6.4, 6.5, 6.6, 6.7, 6.8 10 3.3.2. Otros caracteres especiales 11 3.3.3. Ejemplo 6.9, 6.10 11 3.4. Visualizando números con cout 12 3.4.1. Ejemplos 6.11, 6.12 12 3.5. Visualizando varios valores con un cout 13 3.5.1. Ejemplo 6.13 13 3.6. Visualizando caracteres fijos con cout 13 3.6.1. Ejemplo 6.14 14 3.7. Visualizando cadena de caracteres y números con cout 14 3.7.1. Ejemplo 6.15, 6.16, 6.17 14 3.8. Utilizando cout para combinar diferentes tipos de valores 15 3.8.1. Ejemplos 6.18 15 3.9. Visualizando objetos variable con cout 16 3.9.1. Ejemplo 6.19 16 3.10. Salida de variables char * 16 3.10.1. Ejemplo 6.20 17 3.11. Salida de caracteres con la función miembro put( ); put( ) en cascada 17 4. E/S SIN FORMATO MEDIANTE read( ) , gcount( ) y write( ) 17 4.1. Ejemplo 6.21 18 5. REDIRECCIONANDO LA SALIDA DE cout 19 5.1. Ejemplos 6.22, 6.23 19 6. EXAMEN BREVE 14 20 7. MANIPULACIÓN DEL FLUJO 20 7.1. Cambio de base para números enteros: dec, oct , hex y setbase( ) 22 7.1.1. Ejemplos 6.24, 6.25 22 7.2. Precisión de punto flotante 23 7.2.1. Ejemplos 6.26, 6.27 24 7.3. Anchura de campo (setw( ) , width( ) ) 25 7.3.1. Ejemplos 6.28, 6.29, 6.30, 6.31, 6.32 26 7.4. Examen breve 15 29 7.5. Manipuladores definidos por el usuario 29 7.5.1. Ejemplo 6.33 29

Upload: others

Post on 15-Apr-2020

10 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-1

CONTENIDO DE LA LECCIÓN 6

FLUJO DE SALIDA ESTANDAR EN C++

1. INTRODUCCIÓN 3 2. FLUJOS 3

2.1. Archivos de encabezado de la biblioteca iostream 4 2.2. Clases y objetos de flujo de entrada/salida 5

3. FLUJO DE SALIDA 7 3.1. Operador de inserción de flujo 7

3.1.1. Ejemplos 6.1, 6.2 7 3.2. Cascada del operador de inserción de flujo 8

3.2.1. Ejemplo 6.3 9 3.3. Uso de caracteres especiales 9

3.3.1. Ejemplos 6.4, 6.5, 6.6, 6.7, 6.8 10 3.3.2. Otros caracteres especiales 11 3.3.3. Ejemplo 6.9, 6.10 11

3.4. Visualizando números con cout 12 3.4.1. Ejemplos 6.11, 6.12 12

3.5. Visualizando varios valores con un cout 13 3.5.1. Ejemplo 6.13 13

3.6. Visualizando caracteres fijos con cout 13 3.6.1. Ejemplo 6.14 14

3.7. Visualizando cadena de caracteres y números con cout 14 3.7.1. Ejemplo 6.15, 6.16, 6.17 14

3.8. Utilizando cout para combinar diferentes tipos de valores 15 3.8.1. Ejemplos 6.18 15

3.9. Visualizando objetos variable con cout 16 3.9.1. Ejemplo 6.19 16

3.10. Salida de variables char * 16 3.10.1. Ejemplo 6.20 17

3.11. Salida de caracteres con la función miembro put( ); put( ) en cascada 17

4. E/S SIN FORMATO MEDIANTE read( ), gcount( ) y write( ) 17 4.1. Ejemplo 6.21 18

5. REDIRECCIONANDO LA SALIDA DE cout 19 5.1. Ejemplos 6.22, 6.23 19

6. EXAMEN BREVE 14 20 7. MANIPULACIÓN DEL FLUJO 20

7.1. Cambio de base para números enteros: dec, oct, hex y setbase( ) 22 7.1.1. Ejemplos 6.24, 6.25 22

7.2. Precisión de punto flotante 23 7.2.1. Ejemplos 6.26, 6.27 24

7.3. Anchura de campo (setw( ), width( )) 25 7.3.1. Ejemplos 6.28, 6.29, 6.30, 6.31, 6.32 26

7.4. Examen breve 15 29 7.5. Manipuladores definidos por el usuario 29

7.5.1. Ejemplo 6.33 29

Page 2: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-2

8. ESTADOS DE FORMATO DE FLUJO 30 8.1. Indicadores de estado de formato 31 8.2. Ceros a la derecha y puntos decimales ( ios::showpoint ) 32

8.2.1. Ejemplo 6.34 32 8.3. Alineación ( ios::left, ios::right, ios::internal ) 33

8.3.1. Ejemplos 6.35, 6.36, 6.37, 6.38 33 8.4. Relleno ( fill, setfill ) 35

8.4.1. Ejemplos 6.39, 6.40 36 8.5. Base de flujo integral ( ios::dec, ios::oct, ios::hex, ios::showbase ) 37

8.5.1. Ejemplo 6.41 38 8.6. Números de punto flotante, notación científica ( ios::scientific, ios::fixed ) 38

8.6.1. Ejemplos 6.42, 6.43 38 8.7. Control de mayúsculas / minúsculas ( ios::uppercase ) 39

8.7.1. Ejemplo 6.44 40 8.8. Establecimiento y restablecimiento de los indicadores de formato 40

( flags, setiosflags, resetiosflags ) 8.8.1. Ejemplo 6.45 40

9. EXAMEN BREVE 16 41 10. ESTADOS DE ERROR DE FLUJO 41

10.1. Ejemplo 6.46 43

11. ENLACE DE UN FLUJO DE SALIDA A UN FLUJO DE ENTRADA 44 12. CONCEPTO DE PRECISIÓN 44

12.1. Ejemplo 6.47 44

13. CONCEPTO DE SOBRE FLUJO 45 13.1. Ejemplo 6.48 46

14. UTILIZANDO cout PARA IMPRIMIR INFORMACIÓN 46 14.1. Ejemplo 6.49 47

15. LO QUE NECESITA SABER 49 16. PREGUNTAS Y PROBLEMAS 53

16.1. Preguntas 53 16.2. Problemas 54

Page 3: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-3

LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN C++

INTRODUCCIÓN En esta lección se verá como generar datos de salida desde el sistema. En general la obtención de datos de entrada al sistema se conoce como lectura y la generación de datos desde el sistema se denomina escritura. Veremos cómo escribir información en la pantalla de su monitor y en la impresora. En otra lección, aprenderá cómo escribir información en un archivo, asi como leer información desde el teclado y desde un archivo en disco.

Objetivo de esta lección: •• Comprender y utilizar el flujo de salida orientada a objetos de C++. •• Aprender a formatear las salidas. •• Comprender la jerarquía de clases de flujo de E/S. •• Aprender a enviar la salida a objetos de tipos definidos por el usuario. •• Crear manipuladores de flujo definidos por el usuario. •• Determinar el éxito o la falla de las operaciones de entrada/salida. •• Saber como enlazar flujos de salida con flujos de entrada.

Las bibliotecas estándar de C++ proporcionan un amplio conjunto de capacidades

de entrada/salida. Esta lección trata de los flujos de E/S comunes, suficiente para resolver la mayoría de los problemas de computación, además ofrece una panorámica de las capacida-des restantes.

Las características de E/S que aquí se describen están orientadas a objetos. Deberá

encontrar interesante el ver la manera en que se implementan. Este estilo de E/S utiliza otras características de C++, tales como referencias, sobrecarga de funciones y de operado-res.

Como veremos, C++ utiliza E/S a prueba de tipos. Cada operación de E/S se realiza

automáticamente en una forma sensible con respecto al tipo de datos. Si una función de E/S se ha definido adecuadamente para que maneje un tipo de dato en particular, entonces dicha función manejará automáticamente ese tipo de datos. Si no hay concordancia entre el tipo de datos y la función que maneja ese tipo de datos, el compilador envía un mensaje de error. Por lo tanto, los datos inadecuados no pueden andar furtivamente por el sistema (co-mo puede suceder en C –un hueco que C permite para producir algunos errores sutiles y extraños).

Los usuarios pueden especificar la E/S tanto de tipos estándar como de tipos defini-

dos por el usuario. Esta capacidad es una de las características más valiosas de C++.

FLUJOS La E/S en C++ se da en flujo de bytes. Un flujo es simplemente una secuencia de bytes. En las operaciones de entrada, los bytes fluyen desde un dispositivo (por ejemplo:

Page 4: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-4

teclado, unidad de disco, escáner) hacia la memoria principal. En operaciones de salida los bytes fluyen de la memoria principal hacia un dispositivo (por ejemplo: pantalla, impreso-ra, unidad de disco, escáner). La aplicación asocia significado a los bytes. Los bytes pueden representar: caracte-res ASCII, datos sin procesar en formato interno, imágenes gráficas, voz digital , video digital o cualquier otro tipo de información que pueda requerir una aplicación. El trabajo de los mecanismos de E/S del sistema es mover bytes de los dispositivos hacia la memoria y viceversa, en forma consistente y confiable. Tales transferencias involu-cran frecuentemente el movimiento mecánico, tal como la rotación de un disco o de una cinta o la digitación de caracteres en un teclado. El tiempo que se llevan estas transferencias normalmente es inmenso en comparación con el tiempo que le lleva al procesador manejar los datos internamente. Por lo tanto, las operaciones de E/S requieren una planeación y afi-nación cuidadosa para asegurar el máximo desempeño. C++ proporciona capacidades de E/S de bajo nivel y alto nivel. Las capacidades de E/S de bajo nivel (es decir, E/S sin formato) por lo general especifican que un cierto núme-ro de bytes deberá transferirse de un dispositivo a la memoria o de la memoria a un disposi-tivo. En dichas transferencias el byte individual es el asunto de interés. Tales capacidades de bajo nivel proporcionan transferencias de alta velocidad y de gran volumen, pero no son particularmente convenientes para los usuarios. Los usuarios prefieren una vista de nivel alto de la E/S (es decir, la E/S formatea-da), en donde los bytes están agrupados en unidades significativas, tales como : enteros, números de punto flotante, caracteres, cadenas y tipos definidos por el usuario. Estas capa-cidades orientadas a tipo son satisfactorias para la mayor parte de la E/S, que no sea el procesamiento de archivo de alto volumen. ARCHIVOS DE ENCABEZADO DE LA BIBLIOTECA iostream La biblioteca iostream de C++ proporciona cientos de capacidades de E/S. Varios archivos de encabezado contienen partes de la interfaz a la biblioteca. La mayoría de los programas C++ incluyen el archivo de encabezado <iostream.h>, que contiene la información básica requerida para todas las operaciones de flujo de E/S. Dicho archivo contiene los objetos cin, cout, cerr y clog, que corresponden respectivamente con el flujo de entrada y salida estándar, el flujo de errores estándar no almacenado en búfer y el flujo de errores estándar almacenado en búfer. Se proporcionan capacidades de E/S formateadas y sin formato. El archivo de encabezado <iomanip.h> contiene información útil para realizar la E/S formateada con los llamados manipuladores de flujo con parámetros. El archivo de encabezado <fstream.h> contiene información importante para las operaciones de procesamiento de archivos controladas por el usuario.

Page 5: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-5

Cada implementación de C++ por lo general contiene otras bibliotecas relacionadas con la E/S que proporcionan capacidades específicas del sistema, tales como el control de dispositivos de propósito especial para E/S de audio y video. CLASES Y OBJETOS DE FLUJO DE ENTRADA / SALIDA La biblioteca iostream contiene muchas clases para manejar una amplia variedad de operaciones de E/S. La clase istream soporta las operaciones de flujo de entrada. La clase ostream soporta las operaciones de flujo de salida. La clase iostream soporta las operacio-nes de flujo tanto de entrada como de salida. La clase istream y la clase ostream deriva mediante herencia simple a partir de la clase base ios. La clase iostream deriva mediante herencia múltiple tanto de la clase is-tream como de la clase ostream. En la figura 6.1 se resumen estas relaciones de herencia.

ios

istream ostream

iostream Figura 6.1 Parte de la jerarquía de clases de flujo de E/S.

La sobrecarga de operadores (utilización de un operador para realizar más de una tarea) proporciona una notación conveniente para la realización de la entrada/salida. El operador de desplazamiento a la izquierda (<<) está sobrecargado para indicar el flujo de salida y se denomina operador de inserción de flujo. El operador de desplazamiento a la derecha (>>) está sobrecargado para indicar el flujo de salida y se denomina operador de extracción de flujo. Estos operadores se utilizan con los objetos de flujo estándar cin, cout, cerr, clog, y comúnmente con los objetos de flujo definidos por el usuario. cin es un objeto de la clase istream, y se dice que está enlazado (o conectado) al dispositivo de entrada estándar que normalmente es el teclado. El operador de extracción de flujo, como se utiliza en la siguiente instrucción, causa que un valor para la variable entera calificacion (suponiendo que calificacion ha sido declarada como int) se reciba desde cin hacia la memoria:

cin >> calificacion;

Observe que la operación de extracción de flujo es lo suficientemente inteligente para saber el tipo de dato que es. Suponiendo que calificacion se haya declarado adecua-damente, no se necesita especificar información adicional con dicho operador (como es el caso de la E/S estilo C). cout es un objeto de la clase ostream, y se dice que está enlazado al dispositivo de salida estándar que normalmente es la pantalla. El operador de inserción de flujo, como se

Page 6: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-6

utiliza en la siguiente instrucción, causa que al valor de la variable entera calificacion se le dé salida desde la memoria hacia el dispositivo de salida estándar:

cout << calificacion;

Observe que el operador de inserción es lo suficientemente inteligente para saber el tipo de calificacion (suponiendo que se haya declarado adecuadamente), por lo que no se necesita especificar información adicional con dicho operador. El formato general para el enunciado cout es el siguiente:

cout << elemento1 << elemento2 << elemento 3 << ... << elementoN;

Como puede observar, después de cout sigue una lista de elementos para escribirse, los cuales están separadas por el operador de inserción de flujo <<. De esta manera, un enunciado cout representa una secuencia o flujo de datos o que se dirige a la pantalla del monitor. Los elementos se insertan dentro de un flujo de salida a través del operador de inserción de flujo <<. Conforme los elementos se insertan dentro del flujo, estos fluyen a la pantalla de su monitor, como se ilustra en la figura 6.3:

cout << elemento1 << elemento2 << elemento3 << ... << elementoN;

Elementos de datos del flujo de salida cout que se muestran en la pantalla Figura 6.3 . Los elementos que se muestran se insertan dentro del flujo de salida cout usando el operador de

inserción de flujo <<.

Algunos sistemas acumulan información de salida en una memoria temporal (búfer o buffer) hasta que haya suficiente información para justificar la escritura en la pantalla. cerr es un objeto de la clase ostream, y se dice que está enlazado al dispositivo de errores estándar. Las salidas hacia el objeto cerr no se almacena en el búfer. Esto significa que cada inserción de flujo de cerr causa que su salida aparezca inmediatamente; esto es adecuado para notificar al usuario algún error en forma inmediata. clog es un objeto de la clase ostream, y también se dice que esta enlazado al dispo-sitivo de errores estándar. Las salidas de clog se almacenan en el búfer. Esto significa que cada inserción a clog puede causar que su salida se conserve en un búfer hasta que éste se llene o vacíe.

Elemento1 ElementoN

Elemento2

Elemento3

...

PANTALLA

Page 7: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-7

El procesamiento de archivos de C++ utiliza las clases ifstream para realizar opera-ciones de entrada de archivo, ofstream para las operaciones de salida de archivo y fstream para las operaciones de entrada/salida de archivo. La clase ifstream hereda de istream, la clase ofstream hereda de ostream y la clase fstream hereda de iostream. En la figura 6.2 se resumen las diversas relaciones de herencia de las clases relacionadas con la E/S. Existen más clases, en la jerarquía de clases de flujo de E/S completa, soportadas en la mayoría de las instalaciones, pero las clases que aquí se muestran proporcionan las capacidades que necesitan casi todos los programadores. Si desea más información sobre el procesamiento de archivos, vea la referencia de la biblioteca de clases de su sistema C++.

ios

istream ostream

ifstream iostream ofstream

fstream

Figura 6.2 Parte de la jerarquía de clases de flujo de E/S con las principales clases para el procesamiento de archivos.

FLUJO DE SALIDA La clase ostream de C++ proporciona la habilidad para realizar salida formateada y sin formato. Las capacidades para la salida incluyen: salida de tipos de datos estándar con el operador de inserción de flujo, salida de caracteres con la función miembro put( ), sali-da sin formato con la función miembro write( ), salida de enteros en formatos decimal, oc-tal y hexadecimal, salida de valores de punto flotante con diversas precisiones, con puntos decimales forzados en notación científica y en notación fija, salida de datos alineados en campos de anchura indicados, salida de datos en campos rellenados con caracteres especi-ficados y salida de letras mayúsculas en notación científica y notación hexadecimal. OPERADOR DE INSERCIÓN DE FLUJO El flujo de salida puede realizarse mediante el operador de inserción de flujo << sobrecargado. Dicho operador está sobrecargado para dar salida a elementos de datos de tipos estándar: numérico, cadenas y valores de apuntador. Ejemplo 6.1

El siguiente programa: SALUDOS1.CPP , muestra la salida de una cadena utilizando una sola ins-trucción de inserción de flujo.

Page 8: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-8

Ejemplo 6.2

El siguiente programa: SALUDOS2.CPP, muestra la misma salida que el programa SALU-DOS1.CPP, utilizando varias instrucciones de inserción de flujo.

CASCADA DEL OPERADOR DE INSERCIÓN DE FLUJO Los operadores << y >> sobrecargados pueden utilizarse en forma de cascada, co-mo se muestra en el siguiente ejemplo: Ejemplo 6.3

El siguiente programa: CASCADA.CPP, ilustra el uso del operador << sobrecargado en forma de cascada.

Las múltiples inserciones de flujo del programa CASCADA.CPP, se ejecutan como si hubie-ran sido escritas de la siguiente manera :

/* El siguiente programa: SALUDOS1.CPP, muestra la salida de una cadena utilizando una sola instrucción de inserción de flujo. */ #include <iostream.h> //Para cout void main( void ) { cout << "¡Bienvenidos al INSTITUTO POLITÉCNICO NACIONAL!"; }//Fin de main( )

/* El siguiente programa: SALUDOS2.CPP, muestra la salida de una cadena utilizando varias instrucciones de inserción de flujo. */ #include <iostream.h> //Para cout void main( void ) { cout << "¡Bienvenidos al "; cout << "INSTITUTO POLITÉCNICO NACIONAL! "; }//Fin de main( )

/* El siguiente programa: CASCADA.CPP, ilustra el uso del operador de inserción << utilizado en forma de cascada. */ #include <iostream.h> //Para cout void main( void ) { cout << "15 más 27 es: " << ( 15 + 27 ) << endl; }//Fin de main( )

Salida : ¡Bienvenidos al INSTITUTO POLITECNICO NACIONAL!

Salida : ¡Bienvenidos al INSTITUTO POLITECNICO NACIONAL!

Salida : 15 más 27 es: 42

Page 9: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-9

( ( ( cout << "15 más 27 es: ") << ( 15 + 27 ) ) << endl );

es decir, << asocia de izquierda a derecha. Este tipo de puesta en cascada de los operadores de inserción de flujo se permite debido a que el operador << sobrecargado devuelve una re-ferencia hacia el objeto operando izquierdo –es decir, cout. Por lo tanto, la expresión entre paréntesis del extremo izquierdo

( cout << "15 más 27 es: " )

envía la cadena de caracteres y devuelve una referencia a cout. Esto permite evaluar la ex-presión que está entre paréntesis en la parte media como

( cout << ( 15 + 27 ) ) que envía el valor entero 100 y devuelve una referencia a cout. A continuación la expresión entre paréntesis más a la derecha se evalúa como

( cout << endl ); que envía a la salida un salto a una nueva línea, vacía a cout y devuelve una referencia a co-ut. Esta última devolución ya no se utiliza.

USO DE CARACTERES ESPECIALES La mayoría de los programas que elaborará, visualizarán varias líneas de salida. Cuando desea avanzar el cursor al principio de una nueva línea, puede utilizar el carácter nueva línea ( '\n ' ) en el flujo de salida. Cuando se inserta en el flujo de salida, se genera un retorno de carro/salto de línea (CRLF). C++ le proporciona dos maneras de generar una nueva línea.

Primero, puede colocar el carácter '\n' dentro de una cadena de caracteres como se muestra en el Ejemplo 6.4:

Ejemplo 6.4

El siguiente programa: DOSLINEAS.CPP, visualiza la salida de dos cadenas en dos líneas, utilizan-do la secuencia de escape '\n'.

/* El siguiente programa: DOSLINEAS.CPP, muestra en la pantalla dos cadenas de caracteres en dos líneas, utilizando el carácter de escape '\n'. */ #include <iostream.h> // Para cout void main( void ) { cout << "Esta es la línea uno.\nEsta es la línea dos."; } // Fin de main( )

Salida: Esta es la línea uno. Esta es la línea dos.

Page 10: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-10

Segundo, si no esta desplegando una cadena de caracteres, puede colocar el carácter nueva línea entre apóstrofes, como se ve en el Ejemplo 6.5: Ejemplo 6.5

El siguiente programa NVALINEA.CPP visualiza los números 1,0,0 y 1 en líneas diferentes:

En vez de utilizar el carácter nueva línea, puede ut ilizar el manipulador de flujo

(ver este tema más adelante) endl (end line). El manipulador de flujo endl hace dos cosas: primero, al igual que la secuencia de escape '\n' genera un CRLF y, segundo, a diferencia de la secuencia de escape '\n', inmediatamente emite la salida. El manipulador de flujo endl hace que cualquier información acumulada en la memoria temporal o búfer se escriba inmediatamente. Ejemplo 6.6

El siguiente programa: ENDL1.CPP , muestra el uso del manipulador de flujo endl.

Ejemplo 6.7

El siguiente programa: ENDL2.CPP , ilustra el uso de endl:

/* El siguiente programa: NVALINEA.CPP, visualiza los números 1, 0, 0 y 1 en líneas diferentes. */ #include <iostream.h> // Para cout void main( void )

{ cout << 1 << '\n' << 0 << '\n' << 0 << '\n' << 1;

} // Fin de main( )

/* El siguiente programa. ENDL2.CPP, ilustra el uso del manipulador endl. */ #include <iostream.h> // Para cout void main( void ) { cout << "El lenguaje C++ es ... " << endl << "bastante fácil.";

} // Fin de main( )

/* El siguiente programa: ENDL1.CPP, muestra el uso del manipulador de flujo endl. */ #include <iostream.h> //Para cout void main( void ) { cout << "¡Bienvenidos al "; cout << "INSTITUTO POLITÉCNICO NACIONAL!"; cout << endl; }//Fin de main( )

Salida: 1 0 0 1

Salida: ¡Bienvenidos al INSTITUTO POLITECNICO NACIONAL!

Salida: El lenguaje C++ es ... bastante fácil.

Page 11: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-11

Ejemplo 6.8

Es posible enviar a la salida expresiones tal como se muestra en el siguiente programa: EXPRESIO-NES.CPP .

OTROS CARACTERES ESPECIALES

En la lección 3 página 3-24 (constantes de tipo carácter y cadena) hemos visto ya los caracteres especiales, los repetiremos simplemente para tener una rápida referencia.

Carácter Propósito \a Carácter alerta (o campana) \b Carácter retroceso (backspace) \f Carácter alimentación de hoja (formfeed) \n Carácter nueva línea (newline) \r Carácter retroceso de carro (carriage return) (no alimenta nueva línea) \t Carácter de tabulador horizontal (horizontal tab) \v Carácter de tabulador vertical (vertical tab) \\ Carácter diagonal inverso (backslash) \? Carácter interrogación (question mark) \’ Carácter apóstrofe \” Carácter comillas \0 Carácter nulo \0OO Valor octal tal como \007 \xhhh Valor hexadecimal tal como \xFFFF

Ejemplo 6.9

El siguiente programa: ESPECIAL.CPP utiliza los caracteres especiales '\a' (alerta) y tabulador ( '\t' ) para emitir un sonido en la bocina de la computadora y luego visualiza las palabras, Campana Campana Campana , separadas cada una de ellas por un tabulador.

/* El siguiente programa: EXPRESIONES.CPP, muestra el uso de envío a la salida de valores de expresiones. */ #include <iostream.h> //Para cout void main( void ) { cout << "15 más 27 es: "; //No se necesitan los paréntesis, pero se utilizan para claridad cout << ( 15 + 27 ); //expresión cout << '\n'; }//Fin de main( )

Salida: 15 más 27 es: 42

Page 12: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-12

Como antes hemos dicho, la salida no es inmediatamente emitida al dispositivo, sino más bien se va acumulando en cierta área de la memoria (búfer o buffer) asignada a tal dis-positivo. Sin embargo, cuando se encuentra con el manipulador endl o bien una operación de lectura, el búfer es vaciado (enviar la información al dispositivo). Si desea vaciar inme-diatamente el buffer asignado al dispositivo sin necesidad de dar un salto de línea se puede utilizar la palabra flush. Ejemplo 6.10

El siguiente programa: FLUSH.CPP, ilustra el uso del manipulador flush para vaciar el búfer. VISUALIZANDO NÚMEROS CON cout Cuando quiera escribir información numérica fija, simplemente inserte los valores numéricos dentro del flujo de salida cout utilizando el operador <<. Ejemplo 6.11

El siguiente programa: 1001.CPP despliega el número 1001 en su pantalla:

/* El siguiente programa: 1001.CPP, despliega el número 1001 por pantalla. */ #include <iostream.h> // Para cout void main( void ) { cout << 1001;

} // Fin de main( )

/* El siguiente programa: FLUSH.CPP, muestra el uso del manipulador flush para enviar inmediatamente la salida al dispositivo. */ #include <iostream.h> // Para cout void main( void )

{ cout << "Esta línea aparece inmediatamente." << flush; cout << "\nLo mismo sucede con esta línea..." << flush;

} // Fin de main( )

/* El siguiente programa: ESPECIAL.CPP, utiliza los caracteres especiales '\a' (alerta) y tabulador ( '\t') para emitir un sonido en la bocina de la computadora y luego visualiza las palabras, Campana Campana Campana , separadas cada una por un tabulador. */ #include <iostream.h> // Para cout void main( void ) { cout << "Campana\a\tCampana\a\tCampana\a"; } // Fin de main( )

Salida: Campana Campana Campana

Salida: Esta línea aparece inmediatamente. Lo mismo sucede con esta línea...

Salida: 1001

Page 13: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-13

Ejemplo 6.12

Cuando se inserta un valor de punto flotante fijo, se obtiene el decimal fijo equivalente en la salida, no el equivalente exponencial. El siguiente programa: FLOTANTE.CPP, usa cout para desplegar el número 0.12345 en su pantalla.

VISUALIZANDO VARIOS VALORES CON UN cout Cuando utiliza cout, puede utilizar el operador de inserción más de una vez por enunciado. La salida no genera ningún espacio entre los elementos. Ejemplo 6.13

El siguiente programa: 1001BIS.CPP, usa el operador cuatro veces para desplegar el número 1001 en la pantalla.

Ambas condiciones (espaciado y salida decimal) se pueden modificar con las opciones de formato dentro del enunciado cout. El formato de salida se explicará mas adelante (Manipulación de flujo).

VISUALIZANDO CARACTERES FIJOS CON cout Para escribir información de caracteres, deberá encerrar la información de salida entre comillas (comillas simples para caracteres sencillos y comillas dobles para cadenas de caracteres). Por consiguiente, el enunciado:

cout << 'A';

genera como salida una A.

/* El siguiente programa: FLOTANTE.CPP, despliega el número 0.12345 por pantalla. */ #include <iostream.h> // Para cout void main( void ) { cout << 0.12345;

} // Fin de main( )

/* El siguiente programa: 1001BIS.CPP, utiliza el operador << cuatro veces para desplegar el número 1001 en la pantalla. */ #include <iostream.h> // Para cout void main( void ) { cout << 1 << 0 << 0 << 1;

} // Fin de main( )

Salida: 0.12345

Salida: 1001

Page 14: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-14

El enunciado:

cout << "La vida es bella! "; produce como salida: ¡La vida es bella! Ejemplo 6.14

Veamos un ejemplo en el que se muestren varios mensajes en la pantalla del monitor. Llamemos al programa COUT.CPP:

VISUALIZANDO CADENA DE CARACTERES Y NÚMEROS CON cout Ejemplo 6.15

El siguiente programa: CVALNUM.CPP, utiliza cout para visualizar cadena de caracteres y núme-ros:

Ejemplo 6.16

El programa siguiente: MSTR1001.CPP visualiza una cadena de caracteres y un número utilizando un cout:

/* El siguiente programa: COUT.CPP, utiliza el objeto de flujo de salida cout para visualizar varios mensajes en la pantalla del monitor. */ #include <iostream.h> // Para cout void main( void ) { cout << "Esta es la línea uno.\n"; cout << "Este texto se encuentra ";

cout << "en la línea dos.\n"; cout << "Esta es la última línea.";

} // Fin de main( )

/* El siguiente programa: CVALNUM.CPP, muestra como cout visualiza cadena de caracteres y números. */ #include <iostream.h> // Para cout void main( void ) {

cout << "cout le permite visualizar cadenas de caracteres, números enteros\n"; cout << "y de punto flotante.\n\n"; cout << 1001;

cout << '\n'; cout << 1.2345; } // Fin de main( )

Salida: Esta es la línea uno. Este texto se encuentra en la línea dos. Esta es la última línea.

Salida: cout le permite visualizar cadenas de caracteres , números enteros y de punto flotante. 1001 1.2345

Page 15: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-15

Ejemplo 6.17

El programa siguiente: ENM1001.CPP, visualiza el número 1001 en medio de dos cadenas de carac-teres:

UTILIZANDO cout PARA COMBINAR DIFERENTES TIPOS DE VALORES Ejemplo 6.18

Un objeto de flujo de salida cout le permite escribir diferentes tipos de valores, como se muestra en el siguiente programa: UNCOUT.CPP:

/* El siguiente programa: UNCOUT.CPP, le muestra como se puede utilizar un solo cout para escribir cadenas y números de diferentes tipos. */ #include <iostream.h> // Para cout void main( void ) { cout << "cout visualiza cadenas " << "\n\n" << 1001 << '\n' << 1.2345; } // Fin de main( )

Salida: cout visualiza cadenas 1001 1.2345

/* El siguiente programa: MSTR1001.CPP, visualiza una cadena de caracteres y un número, utilizando un solo cout. */ #include <iostream.h> // Para cout void main( void ) { cout << "Mi número favorito es: " << 1001;

} // Fin de main( )

/* El siguiente programa: ENM1001.CPP, visualiza el número 1001 en medio de dos cadenas de caracteres. */ #include <iostream.h> // Para cout void main( void ) { cout << "El número " << 1001 << " es mi favorito";

} // Fin de main( )

Salida: Mi número favorito es: 1001

Salida: El número 1001 es mi favorito

Page 16: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-16

VISUALIZANDO OBJETOS VARIABLE CON cout Lo siguiente que deberá aprender es cómo escribir información contenida en un ob-jeto variable. De nuevo, ésta es una tarea sencilla si se utiliza el objeto cout: simplemente inserte el (los) identificador(es) de variables dentro del flujo cout con el operador de inser-ción <<. Por ejemplo, si su programa ha definido voltaje, corriente y resistencia como obje-tos variables, puede escribir sus respectivos valores insertándolos dentro de un flujo cout, de la manera siguiente:

cout << voltaje << corriente << resistencia;

El enunciado anterior escribirá los valores almacenados en memoria para voltaje, corriente y resistencia, en ese orden. El orden de salida será el mismo que el orden listado dentro del enunciado cout. Sin embargo, no habrá espacios entre los valores. Los caracte-res en blanco se deben insertar en forma separada para proporcionar espacio. Ejemplo 6.19

El siguiente programa: OHM.CPP, utiliza la ley de Ohm que establece que el voltaje es igual al pro-ducto de la corriente por la resistencia. Su objetivo es escribir un mensaje junto con los valores de la corriente y resistencia, así como el voltaje.

SALIDA DE VARIABLES char *

En la E/S estilo C es necesario que el programador proporcione información del tipo de datos. C++ determina automáticamente los tipos de datos –una mejora agradable sobre C. Pero a veces esto resulta un estorbo. Por ejemplo, sabemos que una cadena de caracteres

/* El siguiente programa: OHM.CPP, calcula y muestra el voltaje usando la ley de OHM. */ #include <iostream.h> // Para cout void main( void ) {

float voltaje = 0.0; // Para el voltaje calculado. float corriente = 0.001; // Valor de la corriente. float resistencia = 4700.0; // Valor de la resistencia. // Breve descripción del programa.

cout << "Este programa calculará el voltaje dada una corriente de 0.001 " "amperes\ny una resistencia de 4700.0 ohms." << endl << endl;

// Cálculo del voltaje utilizando la ley de Ohm. voltaje = corriente * resistencia; // Mostrar los resultados. cout << "Valor de corriente = " << corriente << " amperes.\n" "Valor de resistencia = " << resistencia << " ohms.\n" "Valor del voltaje resultante = " << voltaje << " volts" << endl; } // Fin de main ( )

Salida: Este programa calculará el voltaje dada una corriente de 0.001 amperes y una resistencia de 4700.0 ohms. Valor de corriente = 0.001 amperes. Valor de resistencia = 4700 ohms. Valor del voltaje resultante = 4.7 volts

Page 17: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-17

es de tipo char *. Supongamos que quiere imprimir el valor de ese apuntador, es decir, la dirección de memoria del primer carácter de dicha cadena. Pero el operador << ha sido so-brecargado para que imprima los datos de tipo char * como cadenas terminadas en nulo. La solución es hacer una conversión de tipo mediante cast del apuntador a un tipo void * (esto deberá hacerse para cualquier variable de apuntador que el programador desee enviar a la salida como una dirección).

Ejemplo 6.20 El siguiente programa: DIRCHAR.CPP, muestra la impresión de una variable char * en formatos de cadena y dirección. Observe que la dirección se imprime como número hexadecimal (base 16). En C++ los números hexadecimales comienzan con 0x o 0X.

SALIDA DE CARACTERES CON LA FUNCIÓN MIEMBRO put( ); put( ) EN CASCADA La función miembro put( ) envía a la salida un carácter como en

cout.put('A');

que despliega una A en la pantalla. Las llamadas a put( ) pueden ponerse en cascada como en

cout.put( 'A ').put ( '\n' );

la cual da salida a la letra A seguida de un carácter de nueva línea. Como sucede con <<, la instrucción anterior se ejecuta de esta forma debido a que el operador punto (.) asocia de izquierda a derecha y la función miembro put( ) devuelve una referencia al objeto mediante el que se realizó la llamada a put( ). La función put( ) también puede invocarse mediante una expresión de valor ASCII, como en cout.put( 65 ), lo cual también da salida a A.

E/S SIN FORMATO MEDIANTE read( ), gcount( ) y write( ) Aunque la idea de esta lección, es tratar exclusivamente con el objeto flujo de salida de datos, trataremos brevemente el flujo de entrada de datos.

/* El siguiente programa: DIRCHAR.CPP, muestra en pantalla el contenido de una variable char * en formatos de cadena y de dirección. */ #include <iostream.h> //Para cout void main( void ) { char *cadena = "INSTITUTO POLITÉCNICO NACIONAL"; cout << "El valor de cadena es: " << cadena << "\nEl valor de static_cast< void * >( cadena ) es: " << static_cast< void * > ( cadena ) << endl; }//Fin de main( )

Salida: El valor de cadena es: INSTITUTO POLITECNICO NACIONAL El valor de static_cast<void *>( cadena ) es: 0x169f00ba

Page 18: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-18

La entrada/salida sin formato se realiza con las funciones miembro read( ) y wri-te( ). Cada una de ellas da entrada o envía a la salida algún número de bytes desde o hacia un arreglo de caracteres que está en memoria. Estos bytes no tienen ningún formato. Se les da entrada o salida simplemente como bytes sin formato. Por ejemplo, la llamada:

char buffer[] = "INSTITUTO POLITÉCNICO NACIONAL"; cout.write( buffer, 10 );

envía a la salida los primeros 10 bytes de buffer (incluyendo los caracteres nulos que podrí-an causar que terminara la salida con cout y <<). Debido a que una cadena de caracteres se evalúa por la dirección de su primer carácter, la llamada

cout.write( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" , 10 );

despliega los primeros 10 caracteres de la cadena. La función miembro read( ) introduce un número determinado de caracteres en un arreglo. Si se leen menos caracteres que el número indicado, se establece la bandera failbit. Pronto veremos la manera de determinar si se ha establecido failbit. La función miembro gcount( ) reporta cuántos caracteres ha leído la última opera-ción de entrada. Ejemplo 6.21

El siguiente programa: SINFORMATO.CPP, muestra las funciones miembro read( ) y gcount( ) de istream y la función miembro write( ) de ostream. El programa utiliza read( ) para introducir 20 ca-racteres (a partir de una secuencia de entrada más larga) en el arreglo de caracteres buffer, se vale de gcount( ) para determinar el número de caracteres que se introdujeron y emplea write( ) para enviar a la salida los caracteres que están en el buffer.

/* El siguiente programa: SINFORMATO.CPP, ilustra el uso de las funciones miembro read( ), gcount( ) y write( ). */ #include <iostream.h> //Para cout y cin void main( void ) { const int TAMANO = 80; char buffer[TAMANO]; cout << "Introduzca una oración:\n"; cin.read(buffer, 20); cout << "\nLa oración introducida fue:\n"; cout.write( buffer, cin.gcount( ) ); cout << endl; }//Fin de main( )

Salida: Introduzca una oración: DABALE ARROZ A LA ZORRA EL ABAD La oración introducida fue: DABALE ARROZ A LA ZO

Page 19: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-19

REDIRECCIONANDO LA SALIDA DE cout En realidad cout dirige la salida al dispositivo estándar (stdout) asignado al sistema (en nuestro caso lo es la pantalla del monitor). Por lo tanto, es posible desde el sistema operativo redireccionar la salida de cout. Por ejemplo, en el caso del programa FLUSH.CPP, si quisiéramos que la salida de cout fuera dirigida a la impresora, entonces desde el DOS podemos escribir el siguiente comando:

C:\> FLUSH.EXE > prn

o bien si quisiéramos enviarla a un archivo:

C:\> FLUSH.EXE > nombreArchivo

Si por alguna razón desea que la salida no sea redireccionable, por ejemplo, le agra-daría que los mensajes de error que envíe al usuario aparezcan en la pantalla del monitor y no en la impresora, entonces deberá utilizar el objeto cerr en vez del objeto cout. Este obje-to envía la salida al dispositivo estándar para el manejo de errores (stderr) el cual no es redireccionable y normalmente es la pantalla del monitor. Ejemplo 6.22

El siguiente programa: CERR.CPP, ilustra el uso del objeto cerr.

Existe otro objeto de flujo de salida, clog, que se utiliza al igual que cerr, salvo que

la salida no la envía directamente al dispositivo asignado (como es el caso de cerr) sino que la envía al área búfer.

* El siguiente programa: CERR.CPP, utiliza el flujo de salida cerr para visualizar el mensaje "Este mensaje siempre aparece en el dispositivo estándar stderr". */ #include <iostream.h> // Para cout void main( void ) { cerr << "Este mensaje siempre aparece en el dispotivo estándar: stderr";

} // Fin de main( )

Salida: Este mensaje siempre aparece en el dispotivo estándar: stderr

Page 20: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-20

Ejemplo 6.23

El siguiente programa: CLOG.CPP, ilustra el uso de clog.

MANIPULACIÓN DEL FLUJO

A la organización de la salida de un programa se le conoce con el nombre de forma-

teo de la salida. Las formas más comunes de dar formato a la salida son las siguientes: 1. Mediante el uso de funciones miembro de un objeto de flujo. Su sintaxis es la siguiente:

nombreObjetoInvocador.nombreFuncionMiembro(listaArgumentos );

Por ejemplo:

cout.width( 5 ); cout.fill( '*' ); cout.precision( 2 );

Nota: Estas instrucciones se estudiaran mas adelante.

2. Mediante el uso de funciones especiales llamadas manipuladores (o modificadores), con o sin argumentos.

Por ejemplo:

cout << flush; cout << endl; cout << setw( 5 ) << 12 << endl; cout << seprecision( 2 ) << 12.325 << endl;

Nota: Estas instrucciones se estudiaran mas adelante.

3. Mediante el uso de banderas (indicadores) como argumentos de la función miembro setf( ) del objeto de flujo:

Por ejemplo:

cout.setf( ios::fixed ); cout.setf( ios::showpoint );

Nota: Estas instrucciones se estudiaran mas adelante.

/* El siguiente programa: CLOG.CPP, utiliza el flujo de salida clog para visualizar el mensaje "Este mensaje NO siempre aparece inmediatamente en el dispositivo estándar: stderr". */ #include <iostream.h> // Para cout void main( void ) { clog << "Este mensaje NO siempre aparece inmediatamente en el dispositivo estándar: stderr"; } // Fin de main( )

Salida: Este mensaje NO siempre aparece inmediatamene en el dispositivo estándar: stderr

EXAMEN BREVE 14

Page 21: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-21

a. Cualquier bandera (indicador) establecida puede desactivarse. Para desactivar una ban-dera usamos la función miembro unsetf( ). Por ejemplo, el siguiente enunciado hará que el programa deje de incluir el signo de mas antes de los enteros positivos que se envían al flu-jo cout.

cout.unsetf( ios::showpos );

4. Mediante el uso de banderas (indicadores) como argumento de la función setiosflags( ).

a. Cualquier bandera (indicador) establecida puede desactivarse. Para desactivar una bande-ra usamos la función resetiosflags( ). Por ejemplo, el siguiente enunciado hará que el pro-grama deje de justificar la salida de los datos a la izquierda.

resetiosflags( ios::left );

5. Para emplear los manipuladores es preciso incluir la siguiente directiva en el programa:

#include <iomanip.h>

Un manipulador es una función que se invoca de manera no tradicional. A su vez,

la función manipuladora invoca una función miembro. Los manipuladores se colocan des-pués del operador de inserción <<, como si la función manipuladora fuera un elemento que se enviara a la salida. Al igual que las funciones tradicionales, los manipuladores pueden tener o no argumentos. Ya vimos un manipulador: endl.

El manipulador setw( ) y la función miembro width( ) hacen exactamente lo mismo.

Invocamos al modificador setw( ) escribiéndolo después del operador de inserción <<, co-mo si lo fuéramos a enviar al flujo cout, y este a su vez invoca a la función miembro width( ). Por ejemplo, lo que se muestra a continuación despliega los números 15, 25 y 35 usando la anchura de campo especificada:

cout << “Inicio” << setw( 4 ) << 15 << setw( 4 ) << 25 << setw( 6 ) << 30;

La instrucción anterior produce la siguiente salida:

Inicio 15 25 35

(Hay dos espacios antes del 15, dos antes del 25 y cuatro antes del 30). El manipulador setprecision( ) hace exactamente lo mismo que la función miembro

precision( ). Sin embargo, las llamadas a setprecision( ) se escriben después del operador de inserción <<, tal como se hace con el manipulador setw( ). Por ejemplo, lo que sigue despliega los números que se listan empleando el número de dígitos después del punto de-cimal que se indica en la llamada a setprecision( ):

cout.setf( ios::fixed ); cout.setf( ios::showpoint ); cout << ‘$’ << setprecision( 2 ) << 10.3 << endl << ‘$’ << 20.5 << endl; La instrucción anterior produce la siguiente salida salida: $10.30 $20.50

Page 22: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-22

Al igual que con la función miembro precision( ) cuando establecemos el número de dígitos después del punto decimal empleando el manipulador setprecision( ) el efecto per-siste hasta que otra llamada a setprecision( ) o precision( ) cambie el número de dígitos.

C++ proporciona diversos manipuladores de flujo que realizan tareas de formato.

Dichos manipuladores proporcionan capacidades tales como: Establecimiento de: •• Base 8, 10 y 16 para números enteros. •• Precisiones. •• La anchura de campos. •• Punto decimal y ceros a la derecha para flotante y doble. •• La alineación a la izquierda o derecha. •• El caracter de relleno de una salida. •• Los indicadores de formato (restablecimiento). •• Vaciado de flujo. •• Inserción de nuevas líneas en el flujo de salida y vaciado de flujo. •• inserción de un carácter nulo en el flujo de salida y el salto de espacios en blanco en el flujo de

entrada.

Estas características se describen en las siguientes secciones.

CAMBIO DE BASE PARA NUMEROS ENTEROS: dec, oct, hex Y setbase( ) Los enteros normalmente se interpretan como valores en base 10. Para cambiar la base sobre la que se interpretan los enteros en un flujo, inserte el manipulador hex para establecer la base a hexadecimal (base 16), inserte el manipulador oct para establecer la base a octal (base 8), inserte el manipulador de flujo dec para restablecer la base a decimal. La base de un flujo también se puede cambiar por medio del manipulador de flujo setbase( ), el cual toma un argumento entero de 8, 10 o 16 para establecer la base. Debido a que setbase( ) toma un argumento, se le llama manipulador de flujo con parámetro. El uso de setbase( ), o cualquier otro manipulador con parámetro, requiere la inclusión del archivo de encabezado <iomanip.h>. La base permanece igual hasta que se cambia explícitamente. Ejemplo 6.24

El siguiente programa: OCTHEX1.CPP , muestra el uso de los manipuladores de flujo hex, oct, dec y setbase( ).

/* El siguiente programa: OCTHEX1.CPP, ilustra el uso de los manipiladores de flujo oct, hex, dec y setbase( ). */ #include <iostream.h> //Para cout #include <iomanip.h> //Para oct, hex, dec y setbase( ) void main( void ) { int n; cout << "Introduzca un número entero: ";

Salida: Introduzca un número decimal: 456 456 en hexadecimal es : 1c8 456 en octal es : 710 456 en decimal es : 456

Page 23: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-23

Ejemplo 6.25

El siguiente programa: OCTHEX2.CPP, de igual manera ilustra el uso de los manipuladores hex, oct, dec y setbase( ).

NOTA: Observe que cuando utiliza alguno de los manipuladores dec, oct, hex o setbase( ), el mismo permanece activo hasta que termine su programa o utilice un manipulador diferente.

PRECISIÓN DE PUNTO FLOTANTE (precision( ), setprecision( )) Dependiendo de cuando fue escrito su compilador (versión), la precisión se toma como el número de cifras significativas o el número de dígitos después del punto decimal. Así, algunos ejemplos de setprecision( 2 ) según la primera opción son:

23. 2.2e7 2.2 6.9e-1 0.00069

Ejemplos en base a la segunda opción son:

23.56 2.26e7 2.21 0.69 0.69e-4

cin >> n; cout << n << " en hexadecimal es: " << hex << n << '\n' << dec << n << " en octal es : " << oct << n << '\n' << setbase( 10 ) << n << " en decimal es: " << n << endl; }//Fin de main( )

/* El siguiente programa. OCTHEX2.CPP, ilustra el uso de los manipuladores oct, hex, dec, setbase( ). */ #include <iostream.h> // Para cout #include <iomanip.h> // oct, dec, hex, setbase( ) void main( void ) {

// Observe como al utilizar un manipulador el mismo queda activo // hasta que otro manipulador lo desactive. cout << "Octal: " << oct << 10 << ' ' << 20 << endl; cout << "Hexadecimal: " << hex << 10 << ' ' << 20 << endl ; cout << "Decimal: " << dec << 10 << ' ' << 20 << endl; cout << endl; cout << "Octal: " << oct << 10 << endl; cout << "Decimal: " << dec << 0xFF << endl; cout << "Decimal: " << dec << 012 << endl; cout << "Hexadecimal: " << hex << 255 << endl; cout << endl; // Los siguientes ejemplos muestran el uso del manipulador setbase( ) cout << "Octal: " << setbase( 8 ) << 10 << ' ' << 20 << endl; cout << "Hexadecimal: " << setbase( 16 ) << 10 << ' ' << 20 << endl; cout << "Decimal: " << setbase( 10 ) << 10 << ' ' << 20 << endl;

} // Fin de main( )

Salida: Octal: 12 24 Hexadecimal: a 14 Decimal: 10 20 Octal: 12 Decimal: 255 Decimal: 10 Hexadecimal: ff Octal: 12 24 Hexadecimal: a 14 Decimal: 10 20

Page 24: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-24

En estas lecciones, cuando nos refiramos a precision, estaremos hablando de la se-gunda opción: número de dígitos después del punto decimal.

Podemos controlar la precisión de los números de punto flotante utilizando el mani-

pulador de flujo setprecision( ) o la función miembro precision( ). Una llamada a cualquie-ra de éstos establece la precisión para todas las operaciones de salida subsecuentes hasta cambiar nuevamente la precision. La función miembro precision( ) sin argumentos devue l-ve el valor de la precisión actual. Ejemplo 6.26

El siguiente programa: PRECISION1.CPP, ilustra el uso del manipulador setprecision( )

Ejemplo 6.27

El siguiente programa: PRECISION2.CPP, utiliza la función miembro precision( ) y el manipulador setprecision( ) para imprimir una tabla que muestra la raíz cuadrada de 2 con precisiones que varí-an de 0 a 9. (Ver salida a continuación).

/* El siguiente programa: PRECISION1.CPP, muestra el uso del manipulador setprecision( ) para indicar el número de dígitos decimales del valor flotante. */ #include <iostream.h> //Para cout #include <iomanip.h> //Para setprecision( ) void main( void ) { float valor = 1.2345; cout << setiosflags( ios::fixed ); cout << setprecision( 0 ) << valor << endl; cout << setprecision( 1 ) << valor << endl; cout << setprecision( 2 ) << valor << endl; cout << setprecision( 3 ) << valor << endl; cout << setprecision( 4 ) << valor << endl; cout << setprecision( 5 ) << valor << endl; cout << setprecision( 6 ) << valor << endl; } //Fin de main( )

Salida: 1 1.2 1.23 1.235 1.2345 1.23450 1.234500

Salida: Raíz cuadrada de 2 con precisión 0-9. Precisión establecida por la función miembro precision( ): 1 1.4 1.41 1.414 1.4142 1.41421 1.414214 1.4142136 1.41421356 1.414213562

Page 25: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-25

ANCHURA DE CAMPO (setw( ), width( )) La función miembro width( ) de ios establece la anchura del campo (es decir, el nú-mero de posiciones de carácter con el que un valor deberá enviarse a la salida o el número de caracteres que deberá introducirse) y devuelve la anchura anterior. Si los valores proce-sados son más pequeños que la anchura de campo, se insertan caracteres de relleno como relleno. Un valor más grande que el ancho indicado no se truncará, sino que se imprimirá el número completo.

/* El siguiente programa: PRECISION2.CPP, utiliza la función miembro precision( ) y el manipulador setprecision( ) para imprimir una tabla que muestra la raíz cuadrada de 2 con precisiones que varían de 0 a 9. */ #include <iostream.h> //Para cout #include <iomanip.h> //Para precision( ) y setprecision( ) #include <math.h> //Para sqrt( ) void main( void ) { double raiz2 = sqrt( 2.0 ); int posiciones; cout << setiosflags( ios::fixed ) << "Raíz cuadrada de 2 con precision 0-9.\n" << "Precision establecida por la " << "funcion miembro precision( ):" << endl; for( posiciones = 0; posiciones <= 9; posiciones++ ) { cout.precision( posiciones ); cout << raiz2 << '\n'; }//Fin del for cout << "\nPrecision establecida por el " << "manipulador setprecision( ):\n"; for( posiciones = 0; posiciones <= 9; posiciones++ ) cout << setprecision( posiciones ) << raiz2 << '\n'; }//Fin de main( )

Precision establecida por el manipulador setprecision( ): 1 1.4 1.41 1.414 1.4142 1.41421 1.414214 1.4142136 1.41421356 1.414213562

Page 26: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-26

Ejemplo 6.28

El siguiente programa: ANCHURA1.CPP , muestra como se usa cout.width( numeroCaracteres ):

Nota: Cuando utilice la función miembro width( ), debe de especificar el ancho deseado para ca-da valor que desee mostrar.

Ejemplo 6.29

Varios de los programas anteriores visualizan números en la pantalla. Para asegurar que los números se muestren correctamente, el programa debe de manejar los espacios antes y después de los núme-ros. Cuando utiliza cout y cerr para visualizar la salida, sus programas pueden especificar el número mínimo de caracteres requeridos para mostrar la salida utilizando el manipulador setw( ). Para utili-zar setw( ) especifique el número mínimo de caracteres que el valor utilizará. Por ejemplo, el pro-grama siguiente ANCHURA2.CPP utiliza el manipulador setw( ) para seleccionar anchos de 3, 4, 5 y 6 caracteres para el valor 1001.

Nota: Cuando usa setw( ) para seleccionar un ancho, el ancho es únicamente para el siguiente valor. Si requiere especificar un ancho para múltiples valores, requerirá utilizar setw( ) para cada

/* El siguiente programa: ANCHURA1.CPP, ilustra el uso de La función miembro cout.width( ). */ #include <iostream.h> // Para cout void main( void ) { cout << "Mi número favorito es:"; cout.width( 3 ); cout << 1001 << endl; cout << "Mi número favorito es:"; cout.width( 4 ); cout << 1001 << endl; cout << "Mi número favorito es:"; cout.width( 5 ); cout << 1001 << endl; cout << "Mi número favorito es:"; cout.width( 6 ); cout << 1001 << endl;

} // Fin de main()

Salida: Mi número favorito es:1001 Mi número favorito es:1001 Mi número favorito es: 1001 Mi número favorito es: 1001

/* El siguiente programa: ANCHURA2.CPP, ilustra el uso del manipulador setw( ). */ #include <iostream.h> // Para cout #include <iomanip.h> // Para setw( ) void main( void ) { cout << "Mi número favorito es:" << setw( 3 ) << 1001 << endl; cout << "Mi número favorito es:" << setw( 4 ) << 1001 << endl; cout << "Mi número favorito es:" << setw( 5 ) << 1001 << endl; cout << "Mi número favorito es:" << setw( 6 ) << 1001 << endl;

} // Fin de main( )

Salida: Mi número favorito es:1001 Mi número favorito es:1001 Mi número favorito es: 1001 Mi número favorito es: 1001

Page 27: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-27

uno de ellos. Si el ancho es menor que el número a mostrar, C++ toma la decisión correcta de utilizar como ancho, el número de dígitos que el número tenga.

Ejemplo 6.30 El siguiente programa: ANCHURA3.CPP, es otro ejemplo en el que se utiliza setw( ). Ver la salida a continuación: Ejemplo 6.31

Dado un valor de corriente de 0.001 amperes y un valor de resistencia de 4700.0 ohms, escriba un programa llamado: ANCHURA4.CPP , para calcular el voltaje usando la ley de Ohm. Escriba los va-lores de la corriente, resistencia y voltaje usando formato en la salida.

// El siguiente programa: ANCHURA3.CPP, muestra el uso del manipulador setw( ). #include <iostream.h> // Para incluir cout #include <iomanip.h> // Para incluir setw( ) void main( void ) { // Salta cuatro líneas y muestra los encabezados cout << "\n\n\n\n" << setw( 15 ) << "NOMBRE" << setw( 22 ) << "DIRECCIÓN" << setw( 23 ) << "TELÉFONO" << endl; cout << setw( 14 ) << "----" << setw( 22 ) << "-------" << setw( 23 ) << "------" << endl; } //Fin de main( )

Salida: NOMBRE DIRECCION TELEFONO - - - - - - - - - - -- - - - - - -

/* El siguiente programa: ANCHURA4.CPP, muestra los valores de la ley de Ohm en forma tabular. */ #include <iostream.h> // Para incluir cout #include <iomanip.h> // Para incluir setw( ) void main( void ) { // Definición e iniciación de variables float voltaje = 0.0; float corriente = 0.001; float resistencia = 4700.0;

Salida: CORRIENTE RESISTENCIA VOLTAJE - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.001 4700.000 4.700

Page 28: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-28

Nota: Más adelante se explicará el uso de los miembros cout.setf( ios::fixed | ios::left ), y cout.unsetf( ios::fixed ).

Ejemplo 6.32

El siguiente programa: ANCHURA5.CPP, muestra el uso de la función miembro width( ) tanto en la entrada como en la salida. Observe que en la entrada se leerá un máximo de un carácter menos que la anchura, debido a que se hace la previsión para el carácter nulo que se colocará en la cadena de entrada. Recuerde que la extracción de flujo termina cuando se encuentra un espacio en blanco que no está al inicio . El manipulador de flujo setw( ) también puede utilizarse para establecer la anchura de campo. Nota: cuando se pide al usuario que introduzca los datos, éste deberá dar una línea de texto y opri-

mir ENTER seguido del fin de archivo (<ctrl>z en sistemas compatibles con IBM PC, <ctrl>d en sistemas UNIX y Macintosh). Ver la salida a continuación.

// Cálculo del voltaje voltaje = corriente * resistencia; // Muestra los títulos. Se prepara la salida de los valores en formato decimal, // justificado a la izquierda y con tres decimales de precisión. cout.setf( ios::fixed|ios::left ); cout.precision( 3 ); cout << "\n\n\n\n" << setw( 20 ) << "CORRIENTE" << setw( 20 ) << "RESISTENCIA" << setw( 20 ) << "VOLTAJE" << endl; cout << setw( 20 ) << "---------" << setw( 20 ) << "-----------" << setw( 20 ) << "-------" << endl; // Muestra valores //cout.precision( 3 ); ¿Qué ocurre si se cambia la precisión a 2 dec? //cout.unsetf( ios::fixed ); ¿Qué ocurre si se desactiva el formato decimal? cout << setw( 20 ) << corriente << setw( 20 ) << resistencia << setw( 20 ) << voltaje << endl; } //Fin de main( )

Salida: Introduzca una oración: Nuestra vida son los ríos que van a parar a la mar. Nues tra vida son los ríos que van a para r a la mar.

Page 29: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-29

NOTA: Vale la pena que estudie este programa con detenimiento.

MANIPULADORES DEFINIDOS POR EL USUARIO Los usuarios pueden crear sus propios manipuladores de flujo . Ejemplo 6.33

El siguiente programa: MANIPUSUA.CPP, muestra la creación y el uso de los manipuladores de flu-jo campana, retorno (retorno de carro), tabulador y finLinea. Los usuarios también pueden crear sus propios manipuladores de flujo con parámetros –consulte los manuales de su instalación para seguir las instrucciones sobre cómo hacer esto.

/* El siguiente programa: MANIPUSUA.CPP, ilustra el uso de los manipuladores sin parámetros: campana, retorno (retorno de carro), tabulador y finLinea; definidos por el usuario. */ #include <iostream.h> //Para cout //Manipulador finLinea (que utiliza la secuencia de escape \n) //y la función miembro flush) ostream finLinea( ostream &salida ) { return salida << '\n' << flush; }//Fin de finLinea( ) //Manipulador tabulador(que utiliza la secuencia de escape \t) ostream tabulador( ostream &salida ) { return salida << '\t'; }//Fin de tabulador( )

/* El siguiente programa: ANCHURA5.CPP, ilustra el uso de a función miembro width( ). */ #include <iostream.h> //Para cout y cin void main( void ) { int ancho = 5; char cadena[ 10 ]; cout << "Introduzca una oración:\n"; cin.width( 5 ); while( cin >> cadena ) { cout.width( ancho++ ); cout << cadena << endl; cin.width( 5 ); }//Fin del while }//Fin del main( )

Salida: Prueba del manipulador tabulador: a b c Prueba de los manipuladores retorno y campana: -----.....

EXAMEN BREVE 15

Page 30: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-30

ESTADOS DE FORMATO DEL FLUJO Diversos indicadores de formato (banderas de formato) especifican los tipos de formato a realizarse durante las operaciones de E/S de flujo. Las funciones miembro setf( ), unsetf( ) y flags( ) controlan los valores de los indicadores. setf( ) es una función miembro invocada por el objeto cout. Es una abreviatura de set flags, que significa establecer banderas (indicadores). A los argumentos de setf( ), como se ve en la tabla 5.1 se conocen con el nombre de banderas. Originalmente se usó la palabra bandera para referirse a bits individuales que servían para indicar algo, dependiendo de si contenían 0 o 1, por analogía con una bandera real que indica algo al estar izada o arriada. En inglés se dice que un bit se establece (set) si se coloca un 1 en él, y se despeja (clear) si se coloca un 0 en él. De ahí que se acostumbre decir que la bandera se establece cuando se enciende o activa. Así pues, cuando la bandera ios::showpoint (por ejemplo) está estable-cida (es decir, cuando es argumento de setf( )), el flujo que invocó la función setf( ) se com-porta como se describe en la tabla 5.1. La notación ios:: de una bandera significa lo siguiente: La palabra ios es abreviatura de input/output stream e indica que el significado de términos como fixed o showpoint es el que tiene cuando se usan con un flujo de entrada o salida. La notación :: significa usar el significado de lo que sigue a :: en el contexto de lo que precede a ::.

//Manipulador campana (que utiliza la secuencia de escape \a) ostream campana( ostream &salida ) { return salida << '\a'; }//Fin de campana( ) //Manipulador retorno (que utiliza la secuencia de escape \r) ostream retorno(ostream &salida) { return salida << '\r'; }//Fin de retorno( ) void main( void ) { cout << "Prueba del manipulador tabulador:" << finLinea << 'a' << tabulador << 'b' << tabulador << 'c' << finLinea << "Prueba de los manipuladores retorno y campana:" << finLinea << ".........."; cout << campana; cout << retorno << "-----" << finLinea; }//Fin de main( )

Page 31: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-31

INDICADORES DE ESTADO DE FORMATO Cada uno de los indicadores de estado de formato que se muestran en la tabla 5.1 (y algunos que no se muestran) está definido como una enumeración de la clase ios y se expli-can en las siguientes secciones. Estos indicadores pueden controlarse mediante las funciones miembro flags( ), setf( ) y unsetf( ), pero muchos programadores de C++ prefieren utilizar manipuladores de flujo. El programador puede emplear la operación OR a nivel de bits, |, para combinar di-versas operaciones en un solo valor long. Al llamar a la función miembro flags( ) para un flujo y especificar opciones de tipo OR establece las opciones de ese flujo y devuelve un valor long que contiene las opciones anteriores. Este valor se guarda frecuentemente para que sea posible llamar a flags( ) mediante dicho valor a fin de restaurar las opciones previas del flujo. Vea el ejemplo 6.45. La función flags( ) debe especificar un valor que represente los valores de todos los indicadores. Por otro lado, la función setf( ) de un solo argumento especifica uno o más indicadores y los une mediante OR con los valores de indicadores existentes para formar un nuevo estado de formato.

Tabla 5.1 . Indicadores de estado de formato para setf( ) Indicador de estado de formato Descripción ios::skipws Se salta los caracteres de espacio en blanco en un

flujo de entrada. ios::left Alinea la salida a la izquierda de un campo. Los ca-

racteres de relleno aparecen a la derecha, en caso necesario.

ios::right Alinea la salida a la derecha de un campo. Los carac-teres de relleno aparecen a la izquierda, en caso nece-sario.

ios::internal Indica que el signo de un número debe estar alineado a la izquierda en un campo y la magnitud del número debe estar alineada a la derecha en ese mismo campo (es decir, los caracteres de relleno aparecen entre el signo y el número).

ios::dec Especifica que los enteros deben tratarse como valo-res decimales (base 10).

ios::oct Especifica que los enteros deben tratarse como valo-res octales (base 8).

ios::hex Especifica que los enteros deben tratarse como valo-res hexadecimales (base 16).

ios::showbase Especifica que la base de un número debe aparecer en la salida al inicio del número (un 0 inicial para los octales, 0x o 0X inicial para los hexadecimales).

ios::showpoint Especifica que los números de punto flotante deben aparecer en la salida con un punto decimal. Esto se utiliza normalmente con ios::fixed para garantizar un determinado número de dígitos a la derecha del punto decimal.

ios::uppercase Especifica que se debe utilizar X mayúscula en 0X antes de un entero hexadecimal y E mayúscula cuan-do se representa un valor de punto flotante en nota-

Page 32: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-32

ción científica. Indicador de estado de formato Descripción ios::scientific Especifica que la salida de un valor de punto flotante

debe estar en notación científica. ios::fixed Especifica que la salida de un valor de punto flotante

debe estar en notación de punto fijo con un número de dígitos específico a la derecha del punto decimal.

El manipulador de flujo con parámetros setiosflags( ) realiza las mismas tareas que la función miembro setf( ). El manipulador de flujo resetiosflags( ) realiza las mismas tareas que la función miembro unsetf( ). Para utilizar cualquiera de estos manipuladores de flujo asegúrese de emplear #include <iomanip.h>. skipws indica que >> deberá saltarse los espacios en blanco en un flujo de entrada. El comportamiento predeterminado de >> es saltarse los espacios en blanco. Para cambiar esto, se utiliza la llamada a unsetf( ios::skipws ). También es posible utilizar el manipulador de flujo ws para especificar que hay que brincarse los espacios en blanco. CEROS A LA DERECHA Y PUNTOS DECIMALES ( ios::showpoint ) El indicador showpoint se establece para forzar a que un número de punto flotante aparezca en la salida con su punto decimal y sus ceros a la derecha. Un valor de punto flo-tante de 79.0 se imprimirá como 79 cuando showpoint no esté establecido y como 79.000000 (o con tantos ceros a la derecha como lo especifique la precisión actual) cuando sí esté establecido. Ejemplo 6.34

El siguiente programa: PUNTODEC.CPP , muestra el uso de la función miembro setf( ) para estable-cer el indicador showpoint , a fin de controlar los ceros a la derecha y la impresión del punto decimal para los valores de punto flotante. Ver la salida a continuación.

Salida: Antes de establecer el indicador de ios::showpoint 9.9900 se imprime como: 9.99 9.9000 se imprime como: 9.9 9.0000 se imprime como: 9 Después de establecer el indicador de ios::showpoint 9.9900 se imprime como: 9.99000 9.9000 se imprime como: 9.90000 9.0000 se imprime como: 9.00000

/* El siguiente programa: PUNTODEC.CPP, ilustra el control de la impresión de ceros a la derecha y puntos decimales para valores de punto flotante. */ #include <iostream.h> //Para cout void main( void ) { cout << "Antes de establecer el indicador de ios::showpoint\n" << "9.9900 se imprime como: " << 9.9900 << "\n9.9000 se imprime como: " << 9.9000 << "\n9.0000 se imprime como: " << 9.0000 << "\n\nDespués de establecer el indicador de ios::showpoint\n"; cout.setf( ios::showpoint );

Page 33: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-33

ALINEACIÓN ( ios::left, ios::right, ios::internal ) Los indicadores left y right permiten que los campos se alineen a la izquierda con caracteres de relleno a la derecha o se alineen a la derecha con caracteres de relleno a la izquierda, respectivamente. La función miembro fill( ) o el manipulador de flujo con pará-metros setfill( ) especifican los caracteres que van a utilizarse para relleno. internal indica que el signo de un número (o la base cuando el indicador ios::showbase esta establecido) deberá estar alineado a la izquierda dentro del campo, la magnitud del número deberá estar alineada a la derecha y los espacios intermedios deberán estar rellenos con el carácter de relleno. Los indicadores left, right e internal están conteni-dos en el dato miembro estático ios::adjustfield. El argumento ios::adjustfield se debe pro-porcionar como segundo argumento para setf( ) cuando se establecen los indicadores de alineación left, right o internal. Esto permite que setf( ) se asegure que solamente esté esta-blecido uno de los tres indicadores de alineación (son mutuamente excluyentes) Ejemplo 6.35

El siguiente programa: DERIZQ1.CPP, muestra el uso de los manipuladores setw( ), setiosflags( ) y resetiosflags( ), y las funciones setf( ) y unsetf( ), para controlar la alineación a la izquierda o a la de-recha de datos enteros en un campo.Ver la salida a continuación.

cout << "9.9900 se imprime como: " << 9.9900 << "\n9.9000 se imprime como: " << 9.9000 << "\n9.0000 se imprime como: " << 9.0000 << endl; }//Fin de main( )

Salida: La justificación a la derecha está predeterminada: 12345 USO DE FUNCIONES MIEMBRO Use setf( ) para establecer ios::left: 12345 Use unsetf ( ) para restablecer el predeterminado: 12345 USO DE MANIPULADORES CON PARAMETROS Use setiosflags( ) para establecer ios::left: 12345 Use resetiosflags( ) para restablecer el predeterminado: 12345

/* El siguiente programa: DERIZQ1.CPP, muestra el uso de los manipuladores setw( ), setiosflags( ) y resetiosflags( ), y las funciones miembro setf( ) y unsetf( ), para controlar la alineación a la izquierda o a la derecha de datos enteros en un campo. */ #include <iostream.h> //Para cout #include <iomanip.h> //Para los manipuladores void main( void ) { int x = 12345;

Page 34: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-34

Ejemplo 6.36

El siguiente programa: DERIZQ2.CPP , muestra el uso del manipulador setiosflags( )

cout << "La justificación a la derecha está predeterminada:\n" << setw( 10 ) << x << "\n\nUSO DE FUNCIONES MIEMBRO" << "\nUse setf( ) para establecer ios::left:\n" << setw( 10 ); cout.setf( ios::left, ios::adjustfield ); cout << x << "\nUse unsetf( ) para restablecer el predeterminado:\n"; cout.unsetf( ios::left ); cout << setw( 10 ) << x << "\n\nUSO DE MANIPULADORES CON PARÁMETROS" <<"\nUse setiosflags( ) para establecer ios::left:\n" << setw( 10 ) << setiosflags( ios::left ) << x << "\nUse resetiosflags( ) para restablecer el predeterminado:\n" << setw( 10 ) << resetiosflags( ios::left ) << x << endl; }//Fin de main( )

/* El siguiente programa: DERIZQ2.CPP, muestra el uso del manipulador setiosflags( ). */ #include <iostream.h> //Para cout #include <iomanip.h> //Para setiosflags() void main( void ) { cout.width( 60 ); cout << "Este mensaje, por omisión, se justifica a la derecha.\n"; cout.width( 5 ); cout << setiosflags( ios::right ) << 1; cout.width( 5 ); cout << setiosflags( ios::right ) << 2; cout.width( 5 ); cout << setiosflags( ios::right ) << 3 << "\n\n";

cout.width( 60 ); cout << setiosflags( ios::left ) << "Este mensaje se justifica a la izquierda."; cout << '\n'; //Es interesante observar que ocurre si este carácter \n //se agrega al final del mensaje anterior, en vez de //hacerlo en forma independiente como lo hicimos. cout.width( 5 ); cout << setiosflags( ios::left ) << 1; cout.width( 5 ); cout << setiosflags(ios::left) << 2; cout.width( 5 ); cout << setiosflags( ios::left ) << 3 << '\n';

} //Fin de main( )

Salida: Este mensaje, por omisión, se justifica a la derecha. 1 2 3 Este mensaje se justifica a la izquierda. 1 2 3

Page 35: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-35

Ejemplo 6.37

El siguiente programa: RESTAURA.CPP, restaura la justificación a la derecha que es el valor por omisión, utilizando el manipulador resetiosflags( )

Ejemplo 6.38

El siguiente programa: ESPACIOINT.CPP, muestra el uso de los manipuladores de flujo setios-flags( ) y setw( ) para especificar el espacio interno. Observe el uso del indicador ios::showpos para forzar la impresión del signo de más.

RELLENO (fill( ), setfill( ))

La función miembro fill( ) especifica el carácter de relleno que se debe utilizar con los campos alineados, si no se especifica ningún valor, se emplean espacios para el relleno. La función miembro fill( ) devuelve el carácter de relleno anterior. El manipulador setfill( ) también establece el carácter de relleno.

/* El siguiente programa: ESPACIOINT.CPP, muestra la visualización de un entero con espaciado interno y forzado del signo de mas. */ #include <iostream.h> //Para cout #include <iomanip.h> //Para setiosflags( ) y setw( ) void main( void ) { cout << setiosflags( ios::internal | ios::showpos ) << setw( 10 ) << 123 << endl; }//Fin de main( )

/* El siguiente programa: RESTAURA.CPP, utiliza el manipulador resetiosflags( ) para regresar la justificación a su valor por omisión. */ #include <iostream.h> //Para cout #include <iomanip.h> //Para resetiosflags( ) y setiosflags( ) void main( void ) { cout.width( 5 ); cout << setiosflags( ios::left ) << 5 << endl; cout.width( 5 ); cout << 5 << '\n' << resetiosflags( ios::left )<< endl;

cout.width( 5 ); cout << 1;

} //Fin de main( )

Salida: 5 5 1

Salida: + 123

Page 36: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-36

Ejemplo 6.39

El siguiente programa: RELLENO1.CPP, muestra el uso de la función miembro fill( ) y del manipu-lador setfill( ) para controlar el establecimiento y restablecimiento del carácter de relleno. Ver salida a continuación.

Ejemplo 6.40

El siguiente programa: PUNTOS.CPP, ilustra el uso de la función miembro fill( ) y del manipulador setfill( )

/* El siguiente programa: RELLENO1.CPP, ilustra el uso de la función miembro fill( ) y del manipulador setfill( ) para cambiar el carácter de relleno para los campos que sean mas grandes que los valores que se están imprimiendo. */ #include <iostream.h> //Para cout #include <iomanip.h> // setfill( ) void main( void ) { int x = 10000; cout << x << " impreso como un int justificado a derecha e\n" << "izquierda y como hex con justificación interna.\n" << "Utilizando el carácter predeterminado de relleno (espacio): \n"; cout.setf( ios::showbase ); cout << setw( 10 ) << x << '\n'; cout.setf( ios::left, ios::adjustfield ); cout << setw( 10 ) << x << '\n'; cout.setf( ios::internal, ios::adjustfield ); cout << setw( 10 ) << hex << x; cout << "\n\nUtilizando varios caracteres de relleno:\n"; cout.setf( ios::right, ios::adjustfield ); cout.fill( '*' ); cout << setw( 10 ) << dec << x << '\n'; cout.setf( ios::left, ios::adjustfield ); cout << setw( 10 ) << setfill( '%' ) << x << '\n'; cout.setf( ios::internal, ios::adjustfield ); cout << setw( 10 ) << setfill( '^' ) << hex << x << endl; }//Fin de main( )

Salida: 10000 impreso como un int justificado a derecha e izquierda y como hex con jusstificación interna. Utilizando el caracter predeterminado de relleno (espacio): 10000 10000 0x 2710 Utilizando varios caracteres de relleno: *****10000 10000%%%%% 0x^^^^2710

Page 37: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-37

BASE DE FLUJO INTEGRAL (ios::dec, ios::oct, ios::hex, ios::showbase) El miembro estático ios::basefield (que se utiliza en forma similar a ios::adjustfield con setf( )) incluye los bits de indicador ios::oct, ios::hex e ios::dec para especificar que los enteros deben tratarse como valores octales, hexadecimales y decimales, respectivamen-te. Las inserciones de flujo son decimales en forma predeterminada si ninguno de estos bits está establecido. El valor predeterminado para las extracciones de flujo es procesar los da-tos en la forma en que se proporcionan –los enteros que comienzan con 0 se tratan como valores octales, los enteros que comienzan con 0x o 0X se tratan como valores hexadecima-les y todos los demás enteros se tratan como valores decimales. Una vez que se ha especifi-cado una base particular para un flujo, todos los enteros de ese flujo se procesan con dicha base hasta que se especifique una nueva o hasta que llegue el final del programa. Establezca el indicador showbase para forzar la base de un valor entero que se va a enviar a la salida. Los números decimales se envían a la salida en forma normal, los núme-ros octales se envían con un 0 inicial y los números hexadecimales se envían con un 0x inicial o con 0X inicial (el indicador uppercase determina cuál opción se elige)

/* El siguiente programa: PUNTOS.CPP, muestra el uso de los miembros cout.width( ), cout.fill( ) y del manipulador setfill( ), para rellenar con puntos el lado izquierdo de la salida. */ #include <iostream.h> //Para cout y cout.fill( ) #include <iomanip.h> //Para setfill( ) void main( void ) { // Uso de los miembros cout.fill( ) y cout.width( ) cout.fill( '.' ); cout.width( 5 ); cout << 1 << '\n';

cout.width( 6 ); cout << 2 << '\n'; cout.width( 7 ); cout << 3 << "\n\n"; //Uso del mipulador setfill( ) cout.width( 5 ); cout << setfill( '.' ) << 1 << '\n'; cout.width( 6 ); cout << 2 << '\n'; cout.width( 7 ); cout << 3 << '\n';

} //Fin de main( )

Salida: ....1 .....2 ......3 ....1 .....2 ......3

Page 38: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-38

Ejemplo 6.41

El siguiente programa: OCTHEX3.CPP , muestra el uso del indicador showbase para forzar que un entero se imprima en forma decimal, octal y hexadecimal.

NÚMEROS DE PUNTO FLOTANTE, NOTACIÓN CIENTÍFICA (ios::scientific, ios::fixed) El indicador ios::scientific y el indicador ios::fixed están contenidos en el dato

miembro estático ios::floatfield (que se utiliza en forma similar a ios::adjustfield e ios::basefield en setf( )). Estos indicadores se utilizan para controlar el formato de salida de los números de punto flotante. El indicador scientific se establece para forzar la salida de un número de punto flotante en formato científico. El indicador fixed fuerza que un número de punto flotante se despliegue con un número específico de dígitos (tal como lo especifica la función miembro precision( )) a la derecha del punto decimal. Si no están establecidos estos indicadores, el valor del número de punto flotante determina el formato de la salida.

La llamada cout.setf( 0, ios::floatfield ) restaura el formato predeterminado del sis-

tema para la salida de números de punto flotante.

Ejemplo 6.42 El siguiente programa: PUNTOFLOT1.CPP , muestra el despliegue de números de punto flotante en formatos fijo y científico utilizando setf( ) con dos argumentos con ios::floatfield. Ver salida a conti-nuación:

/* El siguiente programa: OCTHEX3.CPP, muestra el uso del indicador showbase para forzar que un entero se imprima en forma decimal, octal y hexadecimal. */ #include <iostream.h> //Para cout #include <iomanip.h> //Para setf void main(void) { int x = 100; cout << setiosflags(ios::showbase) << "Imprimiendo números enteros precedidos por su base:\n" << x << '\n' << oct << x << '\n' << hex << x << endl; }//Fin de main()

Salida: Imprimiendo números enteros precedidos por su base: 100 0144 0x64

Salida: Desplegado en formato predeterminado: 0.00123457 1.946e+09 Desplegado en formato científico: 1.234567e-03 1.946000e+09 Desplegado en formato predeterminado después de unsetf( ): 0.00123457 1.946e+09 Desplegado en formato fijo: 0.001235 1946000000.000000

Page 39: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-39

Ejemplo 6.43

Otra opción para visualizar valores flotantes en notación de punto decimal fijo o notación exponen-cial (científica), es utilizando los manipuladores setiosflags( ) y los indicadores fixed y scientific de la clase ios. El siguiente programa: PUNTOFLOT2.CPP, muestra el uso de estos manipuladores.

CONTROL DE MAYÚSCULAS / MINÚSCULAS (ios::uppercase) El indicador ios::uppercase se establece para forzar que se envía a la salida una X o E mayúsculas con los enteros hexadecimales o con los valores de punto flotante en nota-ción científica, respectivamente.

/* El siguiente programa: PUNTOFLOT2.CPP, muestra el uso del manipulador setiosflags( ) y los indicadores fixed y scientific de la clase ios. */ #include <iostream.h> //Para cout #include <iomanip.h> //Para setiosflags( ) void main( void ) { float valor = 0.000123; cout << setiosflags( ios::fixed ) << valor << endl; cout << setiosflags( ios::scientific ) << valor << endl; } //Fin de main( )

/* El siguiente programa: PUNTOFLOT1.CPP, despliega valores en punto flotante en el formato predeterminado del sistema, científico y fijo. */ #include <iostream.h> //Para cout void main( void ) { double x = .001234567, y = 1.946e9; cout << "Desplegado en formato predeterminado:\n" << x << '\t' << y << '\n'; cout.setf( ios::scientific, ios::floatfield ); cout << "Desplegado en formato científico:\n" << x << '\t' << y << '\n'; cout.unsetf( ios::scientific ); cout << "Desplegado en formato predeterminado después de unsetf( ):\n" << x << '\t' << y << '\n'; cout.setf( ios::fixed, ios::floatfield ); cout << "Desplegado en formato fijo:\n" << x << '\t' << y << endl; }//Fin de main()

Salida: 0.000123 1.230000e-04

Page 40: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-40

Ejemplo 6.44

El siguiente programa: MAYÚSCULA.CPP , ilustra el uso del indicador ios::uppercase.

ESTABLECIMIENTO Y RESTABLECIMIENTO DE LOS INDICADORES DE FORMATO (flags( ), setiosflags( ), resetiosflags( )) La función miembro flags( ) sin argumentos devuelve simplemente (como valor long) los valores actuales de los indicadores de formato. La función miembro flags( ) con un argumento long establece los indicadores de formato, tal como los especifica el argu-mento, y devuelve el valor anterior de los indicadores. Cualquier indicador de formato que no esté especificado en el argumento de flags( ) es restablecido. Observe que los valores iniciales de los indicadores de cada sistema pueden variar. La función miembro setf( ) establece los indicadores de formato proporcionados en su argumento y devuelve como un valor long los valores anteriores de la indicadores como en:

long formatoOriginal = cout.set( ios::showpoint | ios:: showpos );

La función miembro setf( ) con dos argumentos long como en:

cout.setf( ios::left, ios::adjustfield );

Primero borra los bits de ios::adjustfield y luego establece el indicador ios::left. Es-ta versión de setf( ) se utiliza con los campos de bits asociados con ios::basefield (represen-tado por ios::dec, ios::oct e ios::hex), ios::floatfield (representado por ios::scientific e ios::fixed) e ios::adjustfield (representados por ios::left, ios::right e ios::internal). La función miembro unsetf( ) restablece los indicadores designados y devuelve el valor de dichos indicadores antes de restablecerlos. Ejemplo 6.45

El siguiente programa: RESTAURA2.CPP, muestra el uso de la función miembro flags( ) para resta-blecer un nuevo estado de formato y guardar el estado de formato anterior, y luego restaura los valo-res de formato originales.

/* El siguiente programa: MAYUSCULA.CPP, ilustra el uso del indicador ios::uppercase */ #include <iostream.h> //Para cout #include <iomanip.h> //Para setiosflags( ) void main( void ) { cout << setiosflags( ios::uppercase ) << "Imprimiendo letras mayúsculas en los exponentes de la\n" << "notación científica y en los valores hexadecimales:\n" << 4.345e10 << '\n' << hex << 123456789 << endl; }//Fin de main( )

Salida: Imprimiendo letras mayúsculas en los exponentes de la notación científica y en los valores hexadecimales: 4.345e+10 75BCD15

Page 41: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-41

ESTADOS DE ERROR DE FLUJO El estado de un flujo puede probarse por medio de los bits de la clase ios –la clase base de las clases istream, ostream e iostream que estamos utilizando para E/S. El indicador eofbit se establece automáticamente para un flujo de entrada cuando se encuentra el fin de archivo. Un programa puede utilizar la función miembro eof( ) para de-terminar si se ha encontrado el fin de archivo en un flujo. La llamada

/* El siguiente programa: RESTAURA2.CPP, ilustra el uso de la función miembro flags( ). */ #include <iostream.h> //Para cout void main( void ) { int i = 1000; double d = 0.0947628; cout << "El valor de la variable flags es: " << cout.flags( ) << "\nImprime datos int y double en el formato original:\n" << i << '\t' << d << "\n\n"; long formatoOriginal = cout.flags( ios::oct | ios::scientific );

cout << "El valor de la variable flags es: " << cout.flags( ) << "\nImprime datos int y double en el nuevo formato\n" << "especificado utilizando la función miembro flags:\n" << i << '\t' << d << "\n\n"; cout.flags( formatoOriginal ); cout << "El valor de la variable flags es: " << cout.flags( ) << "\nImprime de nuevo datos int y double en el formato original:\n" << i << '\t' << d << endl; }//Fin de main( )

Salida: El valor de la variable flags es: 8193 Imprime datos int y double en el formato original: 1000 0.0947628 El valor de la variable flags es: 4040 Imprime datos int y double en el nuevo formato especificado utilizando la función miembro flags: 1750 9.476280e-02 El valor de la variable flags es: 8193 Imprime de nuevo datos int y double en el formato original: 1000 0.0947628

EXAMEN BREVE 16

Page 42: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-42

cin.eof( );

devuelve true si se ha encontrado el fin de archivo en cin, y false en caso contrario. failbit se establece para un flujo cuando sucede un error de formato en el flujo pero no se ha perdido caracteres. La función miembro fail( ) determina si una operación de flujo ha fallado, y por lo general es posible recuperarse de esos errores.

badbit se establece para un flujo cuando sucede un error que da por consecuencia la pérdida de datos. La función miembro bad( ) determina si ha fallado una operación de flujo. Tales fallas serias por lo general no son recuperables.

goodbit se establece para un flujo si ninguno de los bits eofbit, failbit o badbit se ha

establecido para dicho flujo. La función miembro good( ) devuelve true si las funciones bad( ), fail( ) y eof( )

devuelven false. Las operaciones de E/S sólo deben realizarse en flujos buenos. La función miembro rdstate( ) devuelve el estado de error de flujo. Por ejemplo, una

llamada a cout.rdstate devolvería el estado de flujo que luego podría probarse por medio de una instrucción switch que examinara a ios::eofbit, ios::badbit, ios::failbit e ios::goodbit. El medio preferido para probar el estado de un flujo es utilizar las funciones miembros eof( ), bad( ), fail( ) y good( ), ya que su uso no requiere que el programador esté familiari-zado con los bits de estado particulares.

La función miembro clear( ) se utiliza normalmente para restaurar el estado de un

flujo a bueno para que la E/S pueda continuar en ese flujo. El argumento predeterminado para clear( ) es ios::goodbit, por lo que la instrucción:

cin.clear( );

borra o limpia a cin y establece el flujo a goodbit. La instrucción:

cin.clear( ios::failbit )

Establece, de hecho, a failbit. Tal vez el usuario desee hacer esto cuando realiza en-trada desde cin con un tipo definido por el usuario y encuentra un problema. El nombre clear( ) parece inadecuando en este contexto, pero es correcto. Si badbit, failbit (o ambos) están establecidos, la función miembro operador! de-vuelve true. Si badbit, failbit (o ambos) están establecidos, la función miembro operator void * devuelve false. Estas funciones son útiles en el procesamiento de archivos cuando se está probando una condición verdadera/falsa en la condición de una estructura de selec-ción o una estructura de repetición.

Page 43: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-43

Ejemplo 6.46

El siguiente programa: EDOERROR.CPP, ilustra el uso de las funciones miembro rdstate( ), eof( ), fail( ), bad( ), good( ) y clear( ).

/* El siguiente programa: EDOERROR.CPP, ilustra el uso de la prueba de estados de error. */ #include <iostream.h> //Para cout void main( void ) { int x; cout << "Antes de una operación de entrada de datos errónea:" << "\n cin.rdstate( ): " << cin.rdstate( ) << "\n cin.eof( ): " << cin.eof( ) << "\n cin.fail( ): " << cin.fail( ) << "\n cin.bad( ): " << cin.bad( ) << "\n cin.good( ): " << cin.good( ) << "\n\nSe espera un número entero pero se introdujo un carácter: "; cin >> x; cout << "\nDespués de una operación de entrada de datos errónea:" << "\n cin.rdstate( ): " << cin.rdstate( ) << "\n cin.eof( ): " << cin.eof( ) << "\n cin.fail( ): " << cin.fail( ) << "\n cin.bad( ): " << cin.bad( ) << "\n cin.good( ): " << cin.good( ) << "\n\n"; cin.clear( ); cout << "Después de cin.clear( )" << "\ncin.fail( ): " << cin.fail( ) << "\ncin.good( ): " << cin.good( ) << endl; }//Fin de main( )

Salida: Antes de una operación de entrada de datos errónea: cin.rdstate(): 0 cin.eof(): 0 cin.fail(): 0 cin.bad(): 0 cin.good(): 1 Se espera un número entero pero se introdujo un carácter: a Después de una operación de entrada de datos errónea: cin.rdstate(): 2 cin.eof(): 0 cin.fail(): 2 cin.bad(): 0 cin.good(): 0 Después de cin.clear() cin.fail(): 0 cin.good(): 1

Page 44: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-44

ENLACE DE UN FLUJO DE SALIDA A UN FLUJO DE ENTRADA Las aplicaciones interactivas involucran, por lo general, a un istream para entrada y a un ostream para salida. Cuando aparece un mensaje de petición en la pantalla, el usuario responde dando los datos adecuados. Obviamente la petición necesita aparecer antes de que continúe la operación de entrada. Con el almacenamiento temporal de salida, ésta aparece solamente cuando el búfer está lleno, cuando la salida se vacía en forma explicita por re-querimientos del programa, o bien en forma automática al final del programa. C++ propor-ciona la función miembro tie( ) para sincronizar (es decir, enlazar) la operación de un is-tream y un ostream para asegurarse de que la salida aparezca antes de su entrada subse-cuente. La llamada:

cin.tie( &cout );

enlaza a cout (un ostream) con cin (un istream). De hecho, esta llamada particular es re-dundante, debido a que C++ realiza automáticamente esta operación para crear un entorno de entrada/salida estándar para el usuario. Sin embargo, el usuario podría enlazar explíci-tamente otros pares de istream/ostream. Para desenlazar un flujo de entrada, flujoEntrada, de un flujo de salida se utiliza la llamada:

flujoEntrada.tie( 0 );

CONCEPTO DE PRECISIÓN Dentro de la computadora, los números son representados utilizando combinaciones de UNOS y CEROS (dígitos binarios) Ya que una determinada clase tiene un número fijo de bits, cada clase puede contener exclusivamente un cierto rango de valores. Si asigna un valor fuera de este rango, ocurre un error de sobreflujo. Los valores de punto flotante pue-den experimentar sobreflujo y de precisión insuficiente. Por ejemplo, los valores de clase flotante, proporcionan 6 o 7 dígitos significativos. De esta manera si asigna el valor 1.234567890 a una variable de clase flotante, el valor aproximado es de 1.23456. Los valo-res de tipo doble, por otra parte proporcionan 14 a 15 dígitos significativos, de tal manera que el valor anterior se almacena completamente en la memoria. Cuando trabaje con números de punto flotante, debe de tener cuidado del hecho de que sus valores son representados utilizando un número fijo de bits. De esta manera, es imposible para la computadora, representar siempre un número de manera exacta. Por ejemplo, el valor 0.4, puede que lo represente como 0.3999999, o el valor 0.1 como 0.099999. Ejemplo 6.47

El siguiente programa, PRECISE.CPP , ilustra la diferencia entre precisión sencilla y doble preci-sión:

Page 45: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-45

Observe los valores mostrados y compárelos con los valores iniciales. CONCEPTO DE SOBRE FLUJO La clase de una variable define el rango de valores que puede almacenar y las ope-raciones que pueden realizarse con las mismas. Las variables de clase int, por ejemplo, pueden almacenar valores en el rango de –32768 a 32767. Si asigna un valor fuera de este rango a una variable de clase int, ocurrirá un error de sobre flujo. C++ utiliza 16 bits para representar una variable de tipo int. El bit más significativo se utiliza para determinar el signo de la variable. Si el bit más significativo es 0, el valor es positivo. Si es 1 el valor es negativo. C++ utiliza, por lo tanto 15 bits para representar el valor de la variable. Para comprender porque ocurre un sobre flujo, trabajemos a nivel bit, para lo cual considere los siguientes valores:

0 0000 0000 0000 0000 1 0000 0000 0000 0001 2 0000 0000 0000 0010 3 0000 0000 0000 0011 4 0000 0000 0000 0100 32765 0111 1111 1111 1101 32766 0111 1111 1111 1110 32767 0111 1111 1111 1111

Si le agrega 1 al valor 32767, el resultado que espera es 32768. Sin embargo, C++ muestra el valor –32768, como se muestra a continuación:

32767 0111 1111 1111 1111 + 1 0000 0000 0000 0001

- 32768 10000 0000 0000 0000

/* El siguiente programa: PRECISE.CPP, ilustra la diferencia entre precisión sencilla y doble precisión. */ #include <iostream.h> //Para cout #include <iomanip.h> //Para setprecision( ) void main ( void )

{ float aproximado = 0.1234567890987654321;

double masAproximado = 0.1234567890987654321; cout.setf( ios::fixed );

cout << "Valor en precisión sencilla: " << setprecision( 19 ) << aproximado << endl; cout << "Valor en doble precisión : " << setprecision( 19 ) << masAproximado << endl;

} //Fin de main()

Salida: Valor en precisión sencilla: 0.1234567910432815550 Valor en doble precisión : 0.1234567890987654380

Page 46: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-46

Ejemplo 6.48

El siguiente programa: OVERFLOW.CPP , ilustra como ocurre un sobreflujo:

Observe como la suma de 32767 + 1 = -32768 y -32768 –1 = 32767, lo cual obviamente es un error. Es importante hacer notar que los errores por sobreflujo no son notificados por el compilador.

UTILIZANDO cout PARA IMPRIMIR INFORMACIÓN Todas las operaciones de salida que se han visto hasta ahora harán que la informa-ción se muestre en la pantalla de su monitor. ¿Cómo imprimir su información en la impre-sora? Para realizar la salida a la impresora en C++, debemos escribir el código para crear nuestro propio objeto digamos imprimir. A continuación se muestra un objeto imprimir que se desarrolló para la plataforma DOS:

Este código trabajará solamente en plataformas DOS debido a la referencia específi-ca para el archivo de impresora PRN. Por el momento no es importante que entienda el código anterior orientado a objetos. Ya habrá tiempo. El código simplemente crea un objeto flujo imprimir y lo liga a la impresora de su sistema. Se usará el flujo imprimir como un flujo de salida justo como se ha usado el flujo cout. De esta manera, el formato del enun-ciado imprimir es como sigue:

imprimir << elemento1 << elemento2 << elementos3 << ... << elementoN;

/* El siguiente programa: OVERFLOW.CPP, ilustra el concepto de sobreflujo. */ #include <iostream.h> //Para cout void main (void)

{ int positivo = 32767; int negativo = -32768; cout << positivo << " + 1 = " << (positivo + 1) << endl; cout << negativo << " - 1 = " << (negativo - 1) << endl;

} //Fin de main()

//*********************************************************************** // Este segmento de código define imprimir como un flujo de salida // direccionándolo al puerto de su impresora (PRN) (sólo para DOS). //*********************************************************************** ofstream imprimir; // Define imprimir como un flujo de archivos de salida imprimir.open( "PRN" ); // Abre un archivo de impresión y lo direcciona a PRN if( !imprimir ) // Se asegura que la impresora esté lista { cout << "Hay un problema con la impresora." << endl; exit( 1 ); }

Salida: 32767 + 1 = -32768 -32768 - 1 = 32767

Page 47: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-47

Como puede observar, los elementos que se imprimirán se insertan dentro del flujo imprimir usando el operador de inserción << de la misma forma que se insertaron en el flujo cout. Lo que sigue es un ejemplo que muestra el uso de imprimir. Ejemplo 6.49

El siguiente programa: IMPRIMIR.CPP, cuya información de salida es la misma que la del progra-ma OHM.CPP (resuelto anteriormente) se muestre en la impresora y no en la pantalla del monitor:

Ahora la salida del programa se generará en su impresora y no en la pantalla del monitor. Observe que el código de definición de flujo imprimir se ha integrado dentro de la función main( ) del pro-grama. En resumen, para que este código se compile en forma adecuada se incluyen los archivos de cabecera <fstream.h> y <process.h>. Una vez que se crea el objeto flujo imprimir, simplemente úse-

/* El siguiente programa: IMPRIMIR.CPP, calcula e imprime el voltaje usando la ley de Ohm. */ #include <iostream.h> // Para incluir cout #include <fstream.h> // Para el objeto imprimir #include <process.h> // Para exit( ) void main(void) { //********************************************************************* // Este segmento de código define print como un archivo de salida // direccionándolo al puerto de su impresora (PRN) (sólo para DOS). //********************************************************************* ofstream imprimir; // Define imprimir como un flujo de archivos de salida imprimir.open( "PRN" ); // Abre un archivo de impresión y lo direcciona a PRN if( !imprimir ) // Se asegura que la impresora esté lista { cout << "Hay un problema con la impresora.\n"; exit( 1 ); } float voltaje = 0.0; float corriente = 0.001; float resistencia = 4700.0; cout << "Este programa calculará el voltaje determinado por una corriente de \n" "0.001 amperes y una resistencia de 4700 ohms" << endl; voltaje = corriente * resistencia; imprimir << "Determinado un valor de corriente de " << corriente << " amperes y un\n" "valor de resistencia de " << resistencia << " ohms, el \n" "voltaje resultante es " << voltaje << " volts" << endl; imprimir.close( ); // Cierra el archivo de impresión } // Fin de main( )

Page 48: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-48

lo como cout para escribir la información en la impresora. Esto es porque nuestro objeto imprimir ha heredado las mismas características y comportamiento contenidos en el objeto cout. Ambos son ob-jetos de la clase iostream estándar. Al final de main( ) encontrará el enunciado imprimir.close( ). Es-te enunciado es necesario para cerrar el archivo de impresión.

Page 49: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-49

LO QUE NECESITA SABER Antes de continuar con la siguiente lección, asegúrese de haber comprendido los siguientes conceptos:

qq Las operaciones de E/S se realizan tomando en cuenta el tipo de los datos.

qq La E/S en C++ se realiza en flujos de bytes . Un flujo es simplemente una secuencia de bytes.

qq Los mecanismos de E/S del sistema mueven bytes desde los dispositivos hacia memoria y vice-versa, en forma eficiente y confiable .

qq C++ proporciona capacidades de E/S de bajo nivel y de alto nivel . Las capacidades de E/S de bajo nivel especifican que alguna cantidad de bytes debe transferirse desde un dispositivo hacia memoria o desde memoria hacia un dispositivo. La E/S de alto nivel se realiza con bytes agru-pados en unidades significativas, tales como enteros, números de punto flotante, caracteres, ca-denas y tipos definidos por el usuario.

qq C++ proporciona operaciones de E/S sin formato y formateadas. Las transferencias de E/S sin formato son rápidas, pero procesan datos sin formato que a los usuarios se les dificulta utilizar. La E/S formateada procesa datos en unidades significativas, pero requiere un tiempo de proceso adicional que puede impactar negativamente las transferencias de datos de alto volumen.

qq El flujo de salida cout le permite visualizar caracteres y números.

qq La salida de datos es a cout (el flujo de salida estándar), que por lo general es la pantalla de la computadora, pero cout puede conectarse a otros dispositivos.

qq Su programa puede visualizar una nueva línea utilizando ‘\n’ o ‘endl’. Además, su programa puede utilizar otros caracteres especiales como ‘\t’ para producir un tabulador.

qq Los manipuladores dec, oct, hex le permiten a su programa visualizar valores en decimal, octal y hexadecimal. Utilizando el manipulador setw( ), su programa puede controlar el ancho de su valor de salida.

qq Utilizando el flujo de salida cerr, su programa puede escribir mensajes al dispositivo estándar de errores de su sistema operativo.

qq La obtención de información hacia su computadora se llama lectura y la obtención de informa-ción de su sistema hacia afuera se llama escritura.

qq El enunciado C++ usado para lectura es cin y el enunciado que se usa para escribir es cout.

qq Cada enunciado cout debe incluir una lista de los elementos que se van a escribir. Los elemen-tos en la lista deben separarse por el operador de inserción de flujo <<.

qq El enunciado cout se puede usar para escribir cualquier información variable o fija. La informa-ción numérica fija se escribe simplemente listando los valores numéricos en la lista de elementos de cout. Cuando se escribe información de caracteres fijos, la información escrita debe encerrar-se entre comillas sencillas para caracteres individuales y doble comillas para cadenas de caracte-res.

qq Cuando escriba información variable, el identificador de la variable deberá listarse dentro del enunciado cout. La información se escribirá en la pantalla del monitor o impresora del sistema.

qq Use el objeto de flujo de salida preconstruido cout para escribir hacia la pantalla del monitor, pe-ro deberá definir su propio objeto de flujo de impresión para escribir hacia la impresora .

qq Para dar formato a una salida, a menudo se incluye un manipulador de E/S en la lista de elemen-tos. Como un ejemplo, el manipulador de ancho de campo setw( ) se incluye antes del elemento que se va a escribir para ajustar el ancho de campo del elemento.

qq El valor del manipulador de ancho de campo especifica el número de columnas de salida que serán asignadas para el elemento que se escriba.

qq Deberá incluir el archivo de encabezado <iomanip.h> cuando use el manipulador de E/S setw( ). Además, siempre use un diseño de pantalla para acomodar su resultado y determinar los valores correctos de ancho de campo.

Page 50: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-50

qq La mayoría de los programas de C++ incluyen el archivo de encabezado <iostream.h> que con-tiene la información básica requerida por todas las operaciones de E/S de flujo.

qq El archivo de encabezado <iomanip.h> contiene información para la entrada/salida formateada con manipuladores de flujo con parámetros.

qq El archivo de encabezado <fstream.h> contiene información para las operaciones de proces a-miento de archivos.

qq La clase istream soporta las operaciones de entrada de flujo.

qq La clase ostream soporta las operaciones de s alida de flujo.

qq La clase iostream soporta las operaciones de entrada y de salida de flujo. qq Las clases istream y ostream están derivadas mediante herencia simple a partir de la clase base

ios.

qq La clase iostream está derivada mediante herencia múltiple a partir de las clases istream y os-tream.

qq El operador de desplazamiento a la izquierda (<<) está sobrecargado para designar la salida de flujo y se le menciona como el operador de inserción de flujo.

qq El operador de desplazamiento a la derecha (>>) está sobrecargado para designar la entrada de flu jo y se le menciona como el operador de extracción de flujo.

qq El objeto cin de la clase istream está enlazado al dispositivo de entrada estándar, que es nor-malmente el teclado.

qq El objeto cout de la clase ostream está enlazado al dispositivo de salida estándar, que es nor-malmente la pantalla.

qq El objeto cerr de la clase ostream está enlazado al dispositivo de errores estándar. Las salidas hacia cerr no se almacenan en el búfer, y cada inserción a cerr aparece inmediatamente,

qq El manipulador de flujo endl envía un carácter de nueva línea y vacía el búfer de salida.

qq El compilador C++ determina automáticamente los tipos de datos para la entrada y la salida.

qq Las direcciones se despliegan en forma predeterminada en formato hexadecimal.

qq Para imprimir la dirección que está en una variable de apuntador hay que hacer una conversión mediante cast del tipo de apuntador a void *.

qq La función miembro put( ) envía un carácter a la salida. Las llamadas a put( ) se pueden poner en cascada.

qq La entrada de flujo se realiza mediante el operador de extracción de flujo >>. Este operador se salta automáticamente cualquier espacio en blanco que haya en el flujo de entrada.

qq El operador >> devuelve false cuando encuentra el fin de archivo dentro de un flujo.

qq La extracción de flujo causa que el failbit se establezca cuando hay una entrada inadecuada, y el badbit se establece si la operación falla.

qq Es posible introducir una serie de valores utilizando la operación de extracción de flujo en un encabezado de ciclo while. La extracción devuelve 0 cuando se encuentra el fin de archivo.

qq C++ proporciona entrada/salida a prueba de tipos. Si se procesan datos inesperados con los operadores << y >>, se establecen diversos tipos de indicadores, los cuales pueden ser probados por el usuario para determinar si una operación de E/S ha fallado o ha sido satisfactoria.

qq La E/S sin formato se realiza mediante las funciones miembro read( ) y write( ). Éstas introdu-cen o envían a la salida algún número de bytes hacia o desde memoria iniciando en una direc-ción de memoria designada. Dichos bytes se introducen o envían a la salida como bytes sin for-mato.

qq La función miembro gcount ( ) devuelve el número de caracteres que se introdujeron mediante la operación de read( ) sobre ese flujo.

qq La función miembro read( ) introduce un número específico de caracteres en un arreglo de ca-racteres. failbit( ) se establece si se leen menos del número especificado de caracteres.

Page 51: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-51

qq Para cambiar la base en la que se envían los enteros a la salida, utilice el manipulador hex para establecer la base a hexadecimal (base 16) u oct para establecer la base a octal (base 8) Utilice el manipulador dec para restablecer la base a decimal. La base permanece igual hasta que se le cambia explícitamente.

qq El manipulador de flujo con parámetros setbase( ) también establece la base para la salida de enteros. setbase( ) toma un argumento entero de 10, 8 o 16 para establecer la base.

qq La precisión de punto flotante puede controlarse mediante el manipulador de flujo setpreci-sion( ) o la función miembro precision( ). Ambos establecen la precisión para todas las opera-ciones de salida subsecuentes hasta la siguiente llamada de valor de precisión. La función mie m-bro precision( ) sin argumentos devuelve el valor actual de la precisión.

qq Los manipuladores con parámetros requieren la inclusión del archivo de encabezado <ioma-nip.h>.

qq La función miembro width( ) establece la anchura del campo y devuelve la anchura anterior. Los valores que son más pequeños que el campo se rellenan con caracteres de relleno. El esta-blecimiento de anchura del campo se aplica solamente para la siguiente inserción o extracción; después la anchura de campo se establece implícitarnente a 0 (para que los valores subsecuentes se envíen a la salida con el tamaño necesario). Los valores que son más grandes que un campo se imprimen completamente. La función width( ) sin argumentos devuelve el establecimiento de anchura actual. El manipulador setw( ) también establece la anchura.

qq Para la entrada, el manipulador de flujo setw( ) establece un tamaño de cadena máximo, y si se recibe una cadena más grande, la línea más grande se divide en partes no mayores al tamaño in-dicado.

qq Los usuarios pueden crear sus propios manipuladores de flujo. qq Las funciones miembro setf( ), unsetf( ) y flags( ) controlan los valores de los indicadores. qq El indicador skipws indica que >> se debe saltar los espacios en blanco en un flujo de entrada.

El manipulador de flujo ws también se salta los espacios en blanco iniciales en un flujo de entra-da.

qq Los indicadores de formato están definidos como una enumeración en la clase ios. qq Las funciones miembro flags( ) y setf( ) controlan los indicadores de formato, pero muchos pro-

gramadores de C++ prefieren utilizar los manipuladores de flujo. La operación OR al nivel de bits, |, se puede utilizar para combinar varias opciones en un solo valor long. Llamar a la función miembro flags( ) para un flujo y especificar estas opciones de tipo OR establece las opciones de ese flujo y devuelve un valor long que contiene las opciones anteriores. Este valor se guarda fre-cuentemente para que flags( ) pueda volverse a llamar con dicho valor a fin de restaurar las op-ciones anteriores del flujo.

qq La función flags( ) debe especificar un valor que represente los valores totales de todos los indi-cadores. Por otro lado, la función setf( ) de un solo argumento especifica uno o más indicadores y realiza la operación OR al nivel de bits con los valores de indicadores existentes para formar un nuevo estado de formato.

qq El indicador showpoint se establece para forzar que un número de punto flotante se envie a la salida con un punto decimal y el número de dígitos significativos que se especifican en la preci-sión.

qq Los indicadores lef t y right causan que los campos se alineen a la izquierda con caracteres de relleno a la derecha o se alineen a la derecha con caracteres de relleno a la izquierda.

qq internal indica que el signo de un número (o la base cuando el indicador ios:: showbase está es-tablecido) deberá estar alineado a la izquierda dentro de un campo, la magnitud deberá estar ali-neada a la derecha y los espacios intermedios deberán rellenarse con el carácter de relleno.

qq ios::adjustfield contiene los indicadores left, right e internal.

qq La función miembro fil1( ) especifica el carácter de relleno que se va a utilizar con los campos establecidos con left, right e internal (el valor predeterminado es el espacio) y devuelve el carác-ter de relleno anterior. El manipulador de flujo setfi1l( ) también establece el carácter de relleno.

Page 52: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-52

qq El miembro estático ios::basefield incluye los bits oct, hex y dec para especificar que los ente-ros deben tratarse como valores octales, hexadecimales y decimales, respectivamente. El valor predeterminado para la salida de números es decimal cuando no está establecido ninguno de es-tos bits, y las extracciones de flujo procesan los datos en la forma en que se les proporciona.

qq Establezca el indicador showbase para forzar que la base de un valor entero aparezca en la sali-da.

qq El dato miembro estático ios::floatfield contiene los indicadores scientific y fixed. Establezca el indicador scientific para enviar un número de punto flotante a la salida en formato científico. Es-tablezca el indicador fixed para enviar un número de punto flotante a la salida con la precisión que se especifica en la función miembro precision.

qq La llamada a cout.setf( 0, ios::floatfield ) restaura el formato predeterminado para el despliegue de números de punto flotante.

qq Establezca el indicador uppercase para forzar que se envíe a la salida una X o E mayúsculas con los enteros hexadecimales o los valores de punto flotante en notación científica, respectivamen-te. Cuando el indicador ios::uppercase está establecido, causa que todas las letras de un valor hexadecimal estén en mayúsculas.

qq La función miembro flags( ) sin argumentos devuelve el valor long del establecimiento actual de los indicadores de formato. La función miembro flags( ) con un argumento long establece los indicadores de formato especificados por el argumento y devuelve los valores de indicadores anteriores.

qq La función miembro setf( ) establece los indicadores de formato que están en su argumento y devuelve los valores de indicadores anteriores como un valor long.

qq La función miembro setf ( long setbits, long resetbits ) limpia o borra los bits de resetbits y lue-go establece los bits de setbits.

qq La función miembro unsetf( ) restablece los indicadores designados y devuelve el valor de los indicadores antes de que se reactiven.

qq El manipulador de flujo con parámetros setiosflags( ) realiza las mismas funciones que la fun-ción miembro flags( ).

qq El manipulador de flujo con parámetros resetiosflags( ) realiza las mismas funciones que la función mie mbro unsetf( ).

qq Se puede probar el estado de un flujo por medio de los bits de la clase ios. qq eofbit se establece para un flujo de entrada cuando se encuentra el fin de archivo durante una

operación de entrada. La función miembro eof( ) se utiliza para determinar si se ha establecido el eofbit.

qq failbit se establece para un flujo cuando sucede un error de formato en el flujo pero no se han perdido caracteres. La función miembro fail( ) determina si ha fallado una operación de flujo, y normalmente es posible recuperarse de estos errores.

qq badbit se establece para un flujo cuando sucede un error que da como resultado la pérdida de da-tos. La función miembro bad( ) determina si una operación de flujo ha fallado. Tales fallas son serias por lo general no son recuperables.

qq La función miembro good devuelve true si las funciones bad( ), fail( ) y eof ( )devuelven false. Las operaciones de E/S sólo deben realizarse con flujos buenos.

qq La función miembro rdstate( ) devuelve el estado de error de un flujo.

qq La función miembro clear( ) normalmente se utiliza para restaurar el estado de un flujo a bueno para que pueda continuar la E/S en ese flujo.

qq C++ proporciona la función miembro tie( ) para sincronizar las operaciones de istream y os-tream para asegurar que la salida aparezca antes de las entradas subsecuentes.

Page 53: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-53

PREGUNTAS Y PROBLEMAS PREGUNTAS Indique la salida para cada caso: 1. cout << “\n\n” << endl ;

a. cout << setw( 40 ) << “HOLA” << endl;

b. cout << “*\n**\n***\n****\n*****\n”; c. cout << setw( 12 ) << -36.2 << endl; d. cout << 3.75 << endl; e. cout << ‘\n’ << 1 << ‘\t’ << 2 << ‘\t’ << 3 << ‘\t’ << 4 << endl; f. cout << setw( 20 ) << “Mi registro de prueba es: 97.6/n/n” << endl; g. cout << “\n\t\tREGISTRO PRUEBA\t\t97.5” << endl; h. cout << “\n\t\tREGISTRO PRUEBA\n\t\t97.5” << endl; i. imprimir << “\t\t tREGISTRO PRUEBA\n\t\t97.5\f”;

2. Suponga que define una constante como sigue: const char ESPACIO = ‘ ’;

¿Qué hará el siguiente enunciado? cout << ‘\n’ << setw( 20 ) << ESPACIO << “HOLA” << endl;

3. ¿Qué hará el siguiente enunciado? cout << ‘\n’ << setw( 20 ) << ‘ ’ << “HOLA” << endl;

4. ¿Cuál es la diferencia entre la salida que producen los dos enunciados siguientes? cout << “\n#\n#\n#” << endl; cout << “\n###” << endl;

5. ¿Qué archivo de encabezado deberá incluir para usar el manipulador de ancho de campo setw( )? 6. Suponga que deberá generar dos páginas separadas de salida a una impresora, ¿qué debe hacer para que

avance la impresora a la segunda página una vez que se haya impreso la primera página? 7. Explique el significado de los siguientes objetos:

a. cin

b. cout

c. cerr

d. clog

8. Responda cada una de las siguientes preguntas: a. Los operadores de flujo sobrecargados se definen frecuentemente como funciones ______________ de una clase. b. Los bits de alineación de formato que se pueden ajustar incluyen a _______________, ____________ e ________________. c. La entrada / salida en C++ sucede como ___________ de bytes. d. Los manipuladores de flujo con parámetros ____________ y ____________ pueden utilizarse para establecer y restablecer

los indicadores de estado del formato. e. La mayoría de los programas C++ deben incluir el archivo de encabezado _____________ que contiene la información bási-

ca que se requiere para todas las operaciones de E/S de flujo. f. Las funciones miembro ____________ y __________ se utilizan para establecer y restablecer los indicadores de estado de

formato. g. El archivo de encabezado __________ contiene información para realizar el formato en memoria . h. Cuando se utilizan manipuladores con parámetros se debe incluir el archivo de encabezado ________. i . El archivo de encabezado ____________ contiene información para el procesamiento de archivos controlado por el usuario. j. El manipulador de flujo _____________ inserta un carácter de nueva línea en el flujo de salida y vacía el flujo de salida. k. El archivo de encabezado _____________ se utiliza en programas que mezclan la E/S estilo C y C++. l . La función miembro ________ de ostream se utiliza para realizar salida sin formato. m. La clase ___________ soporta las operaciones de entrada. n. Las salidas hacia el flujo de errores estándar están dirigidas hacia los objetos de flujo __________ o _______________. o. La clase _________ soporta las operaciones de salida. p. El símbolo para el operador de inserción de flujo es _______________. q. Los cuatro objetos que corresponden a los dispositivos estándar del sistema incluyen a __________, ______________,

_______________ y ______________. r. El símbolo para el operador de extracción de flujo es _______________.

Page 54: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-54

s. Los manipuladores de flujo _________, ____________ y _____________ se utilizan para especificar que los enteros se de-ben desplegar en formato octal, hexadecimal y decimal.

t. La precisión predeterminada para el despliegue de valores de punto flotante es ___________. u. Cuando se establece, el indicador ___________ causa que los números positivos se desplieguen con un signo más.

9. Indique si lo siguiente es verdadero o falso. Si la respuesta es falsa explique por qué. a. La función miembro de flujo flags( ) con un argumento long establece la variable de estado flags a su argumento y devuelve

el valor anterior. b. El operador de inserción de flujo << y el operador de extracción de flujo están sobrecargados para manejar todos los tipos de

datos estándar –incluyendo cadenas y direcciones de memoria (solamente la inserción de flujo) y todos los tipos de datos de-finidos por el usuario.

c. La función miembro de flujo flags( ) sin argumentos reactiva todos los bits de indicadores de la variable de estado flags. d. El operador de extracción de flujo >> puede sobrecargarse con una función de operador que tome como argumentos una re-

ferencia a istream y una referencia a un tipo definido por el usuario, y devuelve una referencia a istream. e. El manipulador de flujo ws se salta los espacios en blanco iniciales de un flujo de entrada. f. El operador de inserción de flujo << puede sobrecargarse con una función de operador que tome como argumentos una refe-

rencia a istream y una referencia a un tipo definido por el usuario, y devuelve una referencia a istream. g. La entrada con el operador de extracción de flujo >> siempre se salta los caracteres de espacio en blanco iniciales del flujo

de entrada. h. Las características de entrada y salida se proporcionan como parte de C++. i . La función miembro de flujo rdstate( ) devuelve el estado del flujo actual. j. El flujo cout está normalmente conectado con la pantalla. k. La función miembro de flujo good( ) devuelve true si las funciones miembro bad( ), fail( ) y eof( ) devuelven false. l . El flujo cin está normalmente conectado con la pantalla. m. Si sucede un error no recuperable durante una operación de flujo, la función miembro bad devolverá true. n. La salida hacia cerr no se almacena en el búfer y la salida hacia clog si se almacena en el búfer. o. Cuando se establece el indicador ios::showpoint, se fuerza a que los valores de punto flotante se impriman con la precisión

predeterminada de seis dígitos –siempre y cuando no se haya cambiado el valor de la precisión, en cuyo caso los valores de punto flotante se imprimen con la precisión especificada.

p. La función miembro put de ostream da salida al número de caracteres especificado. q. Los manipuladores de flujo dec, oct y hex solamente afectan las siguiente operación de salida de enteros. r. Cuando se les da salida, de manera predeterminada las direcciones de memorias se despliegan como enteros long.

10. Identifique el error que hay en cada una de las siguientes instrucciones y explique la manera de corregir-las. a. cout << “El valor de x <= y es: “ << x <= y;

b. La siguiente instrucción debe imprimir el valor entero de ‘c’.

cout << ‘c’;

c. cout << ““Una cadena entre comillas””;

PROBLEMAS

1. Utilizando diseño de pantalla, escriba un programa que muestre su primer nombre en la mitad de la pantalla del monitor .

2. Use el diseño de pantalla para escribir un programa que muestre su primer nombre en la esquina superior izquierda de la pantalla usando caracteres con seis líneas de alto.

3. Escriba un programa que genera un rectángulo cuyo centro se localice a la mitad de la pantalla. Construya el rectángulo de 8 líneas de alto y 20 columnas de ancho, con la letra X.

4. Escriba un programa que genere la siguiente salida en la mitad de la pantalla:

ESTUDIANTE PROMEDIA DEL S EMESTRE -------------------- -----------------------------------------

1 84.5 2 67.2

3 77.4 4 86.8 5 94.7

5. Para cada una de las siguientes indicaciones, escriba una sola instrucción que realice la tarea indica-da. a. Envíe a la salida la cadena “Introduzca su nombre: ”.

Page 55: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-55

b. Establezca un indicador que cause que el exponente en notación científica y las letras en valores hexadecimales se impriman en mayúsculas.

c. Envía a la salida la dirección de la variable cadena de tipo char *. d. Establezca un indicador para que los valores de punto flotante se impriman en notación científica. e. Envíe a la salida la dirección de la variable enteroPtr de tipo int *. f. Establezca un indicador para que cuando se envíen valores enteros a la salida, se despliegue la base entera para los valores

octales y hexadecimales. g. Envíe a la salida el valor apuntado por floatPtr de tipo float *. h. Utilice una función miembro de flujo para establecer el carácter de relleno a ‘*’ para imprimir en campos cuya anchura sea

mayor que la de los valores que se envían a la salida. Escriba una instrucción separada para hacer esto con un manipulador de flujo.

i . Envíe a la salida los caracteres ‘O’ y ‘K’ en una instrucción mediante la función put de ostream. j. Utilice la función miembro read de istream para introducir 50 caracteres en el arreglo linea de tipo char. k. Utilice la función miembro gcount de istream para determinar el número de caracteres que se introducen en el arreglo de ca-

racteres linea por medio de la última llamada a la función miembro read de istream, y envíe a la salida a ese número de ca-racteres utilizando la función miembro write de ostream.

l . Escriba instrucciones separadas para vaciar el flujo de salida por medio de una función miembro y un manip ulador de flujo. m. Envíe a la salida los siguientes valores: 124, 18.376, ‘Z’, 1000000 y “cadena”. n. Imprima el ajuste de precisión actual utilizando una función miembro. o. Imprima 1.92, 1.925, 1.9258 con 3 dígitos de precisión utilizando un manipulador. p. Imprima el entero 100 en octal, hexadecimal y decimal utilizando manipuladores de flujo. q. Imprima el entero 100 en decimal, octal y hexadecimal utilizando un solo manipulador de flujo para cambiar la base. r. Imprima 1234 alineado a la derecha en un campo de 10 dígitos. s. Utilice las variables enteras x e y para especificar la anchura de campo y precisión que se utilizan para desplegar el valor

double 87.4573, y despliegue el valor.

6. Muestre la salida para cada una de las siguientes instrucciones: a. cout << “1234” << endl; b. cout.width( 5 ); c. cout.fill( ‘*’ ); d. cout << 123 << endl << 123; e. cout << setw( 10 ) << setfill( ‘$’ ) << 10000; f. cout << setw( 8 ) << setprecision( 3 ) << 1024.987654; g. cout << setiosflags( ios::showbase ) << oct << 99 h. << endl << hex << 99; i . cout << 100000 << endl; j. << setiosflags( ios::showpos ) << 100000; k. cout << setw( 10 ) << setprecision( 2 ) << l . << setiosflags( ios::scientific ) << 444.93738;

7. Escriba una instrucción para cada una de las siguientes indicaciones: a. Imprima el entero 40000 alineado a la izquierda en un campo de 15 dígitos. b. Imprima 200 con y sin signo. c. Imprima el valor decimal 100 en forma hexadecimal precedido por 0x. d. Imprima 1.234 en un campo de 9 dígitos con ceros iniciales .

8. Escriba un programa que imprima valores de apuntador utilizando conversiones mediante cast de todos los tipos de datos enteros . ¿Cuáles imprimen valores extraños? ¿Cuáles causan errores?

9. Escriba un programa para probar el resultado de la impresión del valor entero 12345 y el valor de punto flotante 1.2345 en varios tamaños de campo. ¿Qué sucede cuando los valores se imprimen en campos que contienen menos dígitos que los valores?

10. Escriba un programa que imprima el valor 100.453627 redondeado al dígito más cercano, a déci-mos, centésimos, milésimos y diezmilésimos.

11. Escriba un programa que convierta temperaturas Fahrenheit enteras, desde 0 hasta 212 grados, a temperaturas Celsius de punto flotante con 3 dígitos de precisión. Utilice la formula

celsius = 5.0 / 9.0 * ( fahrenheit – 32 );

para realizar el cálculo. La salida debe imprimirse en dos columnas alineadas a la derecha, y las tempera-turas Celsius deberán estar precedidas por un signo para los valores positivos y negativos.

12. Escriba un programa que utilice una estructura for para imprimir una tabla de valores ASCII para los caracteres de conjunto de caracteres ASCII que van del 33 al 126. El programa deberá im-primir el valor decimal, octal y hexadecimal y el valor del carácter para cada carácter. Utilice los manipu-ladores de flujo dec, oct y hex para imprimir los valores enteros.

Page 56: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-56

EXAMEN BREVE 14 1. El archivo que deberá incluir para usar cout es _____________________. 2. El operador que debe emplear para insertar información dentro del flujo cout es el operador

______________________. 3. Escriba un enunciado cout para mostrar su nombre como una cadena fija de información. 4. Escriba un enunciado cout para mostrar su nombre cuando se almacena en una cadena varia-

ble llamada nombre. 5. La secuencia de escape que debe usar para genera un CRLF es _________________.

EXAMEN BREVE 15 1. El archivo que debe incluir para usar el manejador de ancho de campo setw( ) es

_______________________. 2. Escriba un enunciado cout que muestre el valor de una variable de punto flotante llamada

numero justif icado a la izquierda dentro de un ancho de campo de 10 columnas y una precisión de 3 lugares decimales.

3. Explique la diferencia entre usar una \n en comparación con un endl dentro de un enunciado cout.

4. ¿Qué salidas se producenn cuando se ejecutan las siguientes líneas?

cout << “*”;

cout.width( 5 );

cout << 123 << “*” << 123 <<“*” << endl;

cout << “* ” << setw( 5 ) << 123 << “ * ” << 123 << “ * ” << endl ;

5. ¿Qué salidas se producen cuando se ejecutan las siguientes líneas?

cout << “ * ” << setw( 5 ) << 123 ;

cout.setf( ios ::left ) ;

cout << “ * ” << setw( 5 ) << 123 ;

cout.setf( ios ::right ) ;

cout << “ * ” << setw( 5 ) << 123 << “ * ” << endl ;

6. ¿Qué salidas se producen cuando se ejecutan las siguientes líneas?

cout << “ * ” << setw( 5 ) << 123 << “ * ” << 123 << “ * ” << endl ;

cout.setf( ios ::showpos ) ;

cout << “ * ” << setw( 5 ) << 123 << “ * ” << 123 << “ * ” << endl ;

cout.unsetf( ios ::showpos ) ;

cout.setf( ios::left );

cout << “ * ” << setw( 5 ) << 123 << “ * ” << setw( 5 ) << 123 << “ * ” << endl ;

7. ¿Qué salidas se producen cuando se ejecuta la siguiente línea?

cout << “ * ” << setw( 3 ) << 12345 << “ * ” << endl ;

Page 57: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-57

EXAMEN BREVE 16

1. Al formatear salidas, se utilizan las siguientes banderas con la función miembro setf( ). ¿Qué efecto tiene cada una? a. ios::fixed

b. ios::scientific

c. ios::showpoint

d. ios::showpos

e. ios::right

f. ios::left

RESPUESTAS EXAMEN BREVE 14 2. El archivo que debe incluir para usar cout es el archivo de cabecera iostream.h. 3. El operador que debe emplear para insertar información dentro del flujo cout es el operador

de inserción de flujo <<. 4. Lo siguiente es un enunciado cout para mostrar mi nombre como una cadena fija de informa-

ción. cout << “Miguel Angel “ << endl;

5. Lo siguiente es un enunciado cout para mostrar mi nombre cuando se almacena en una variable de cadena llamada nombre.

cout << nombre << endl;

6. La secuencia de escape que se debe utilizar para generar un CRLF es ‘\n’.

RESPUESTAS EXAMEN BREVE 15 1. El archivo que debe incluir para usar el manejador de ancho de campo setw( ) es el archivo de

cabecera iomanip.h. 2. El siguiente enunciado cout mostrará el valor de una variable de punto flotante llamada nume-

ro, justificado a la izquierda dentro de un ancho de campo de 10 columnas y una precisión de 3 lugares decimales:

cout.setf( ios::fixed|ios::left );

cout.precision( 3 );

cout << setw( 10 ) << numero << endl;

3. La diferencia que existe entre usar ‘\n’ en comparación con endl dentro del enunciado cout es que la secuencia de escape ‘\n’ sólo genera una CRLF, mientras que el manejador endl genera un CRLF y vacía la memoria temporal de flujo de salida.

4. La salida es la siguiente:

* 123*123*

* 123*123*

Cada uno de los espacios contiene exactamente dos caracteres en blanco.

5. La salida es la siguiente:

Page 58: CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN …azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 6... · 2008-11-18 · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS 6–

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 6 6-58

* 123*123 * 123*

Cada espacio tiene exactamente dos caracteres en blanco.

6. La salida es la siguiente:

* 123*123*

* +123*+123*

*123 *123 *

Sólo hay un espacio entre el “ * ” y el “ + ” en la segunda línea. Los demás huecos contienen exactamente dos ca-racteres en blanco cada uno.

7. La salida es la siguiente: *12345* Observe que se envía a la salida el entero completo aunque ello requiera más espacio que el que especifica setw( ).

RESPUESTAS EXAMEN BREVE 16

1. Las respuestas son las siguientes: a. ios::fixed Establecer esta bandera hace que los números de punto flotante no se desplieguen en notación e, es

decir, en notación científica.Al establecer esta bandera, se desactiva ios::scientific.

b. ios::scientific Establecer esta bandera hace que los números de punto flotante se desplieguen en notación e, es decir, en notación científica. Al establecer esta bandera, se desactiva ios::fixed.

c. ios::showpoint Establecer esta bandera hace que siempre se despliegue el punto decimal y los ceros a la dere-cha.

d. ios::showpos Establecer esta bandera hace que se despliegue un signo de más antes de los valores positivos en-teros.

e. ios::right Establecer esta bandera hace que la siguiente salida se coloque en el extremo derecho de cualquier campo que se establezca con la función miembro width( ). Es decir, si sobran espacios en blanco, se colocan anates de la salida. Al establecer esta bandera, se desactiva ios::left.

ios::left Establecer esta bandera hace que la siguiente salida se coloque en el extremo izquierdo de cualquier campo que se establezca con la función miembro width( ). Es decir, si sobran espacios en blanco, se colocan después de la salida. Al establecer esta bandera, se desactiva ios::right.