Está en la página 1de 58

MIGUEL .

TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-1
CONTENIDO DE LA LECCIN 6

FLUJO DE SALIDA ESTANDAR EN C++

1. INTRODUCCIN 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 insercin de flujo 7
3.1.1. Ejemplos 6.1, 6.2 7
3.2. Cascada del operador de insercin 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 nmeros 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 nmeros 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 funcin 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. MANIPULACIN DEL FLUJO 20
7.1. Cambio de base para nmeros enteros: dec, oct, hex y setbase( ) 22
7.1.1. Ejemplos 6.24, 6.25 22
7.2. Precisin 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

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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. Alineacin ( 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. Nmeros de punto flotante, notacin cientfica ( ios::scientific, ios::fixed ) 38
8.6.1. Ejemplos 6.42, 6.43 38
8.7. Control de maysculas / minsculas ( 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 PRECISIN 44
12.1. Ejemplo 6.47 44

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

14. UTILIZANDO cout PARA IMPRIMIR INFORMACIN 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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-3
LECCIN 6
FLUJO DE SALIDA ESTANDAR EN C++

INTRODUCCIN

En esta leccin se ver como generar datos de salida desde el sistema. En general la
obtencin de datos de entrada al sistema se conoce como lectura y la generacin de datos
desde el sistema se denomina escritura. Veremos cmo escribir informacin en la pantalla
de su monitor y en la impresora. En otra leccin, aprender cmo escribir informacin en
un archivo, asi como leer informacin desde el teclado y desde un archivo en disco.

Objetivo de esta leccin:

Comprender y utilizar el flujo de salida orientada a objetos de C++.
Aprender a formatear las salidas.
Comprender la jerarqua 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 estndar de C++proporcionan un amplio conjunto de capacidades
de entrada/salida. Esta leccin trata de los flujos de E/S comunes, suficiente para resolver la
mayora de los problemas de computacin, adems ofrece una panormica de las capacida-
des restantes.

Las caractersticas de E/S que aqu se describen estn orientadas a objetos. Deber
encontrar interesante el ver la manera en que se implementan. Este estilo de E/S utiliza
otras caractersticas de C++, tales como referencias, sobrecarga de funciones y de operado-
res.

Como veremos, C++utiliza E/S a prueba de tipos. Cada operacin de E/S se realiza
automticamente en una forma sensible con respecto al tipo de datos. Si una funcin de E/S
se ha definido adecuadamente para que maneje un tipo de dato en particular, entonces dicha
funcin manejar automticamente ese tipo de datos. Si no hay concordancia entre el tipo
de datos y la funcin que maneja ese tipo de datos, el compilador enva 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
extraos).

Los usuarios pueden especificar la E/S tanto de tipos estndar como de tipos defini-
dos por el usuario. Esta capacidad es una de las caractersticas ms 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:
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-4
teclado, unidad de disco, escner) 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, escner).

La aplicacin asocia significado a los bytes. Los bytes pueden representar: caracte-
res ASCI I , datos sin procesar en formato interno, imgenes grficas, voz digital , video
digital o cualquier otro tipo de informacin que pueda requerir una aplicacin.

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 mecnico, tal como la rotacin de un disco o de una
cinta o la digitacin de caracteres en un teclado. El tiempo que se llevan estas transferencias
normalmente es inmenso en comparacin con el tiempo que le lleva al procesador manejar
los datos internamente. Por lo tanto, las operaciones de E/S requieren una planeacin y afi-
nacin cuidadosa para asegurar el mximo desempeo.

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 nme-
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 inters. 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 estn agrupados en unidades significativas, tales como: enteros,
nmeros 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.

ARCHI VOS DE ENCABEZADO DE LA BI BLI OTECA iostream

La biblioteca iostreamde C++proporciona cientos de capacidades de E/S. Varios
archivos de encabezado contienen partes de la interfaz a la biblioteca.

La mayora de los programas C++incluyen el archivo de encabezado <iostream.h>,
que contiene la informacin bsica 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 estndar, el flujo de errores estndar no almacenado en
bfer y el flujo de errores estndar almacenado en bfer. Se proporcionan capacidades de
E/S formateadas y sin formato.

El archivo de encabezado <iomanip.h>contiene informacin til para realizar la
E/S formateada con los llamados manipuladores de flujo con parmetros.

El archivo de encabezado <fstream.h>contiene informacin importante para las
operaciones de procesamiento de archivos controladas por el usuario.

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-5
Cada implementacin de C++por lo general contiene otras bibliotecas relacionadas
con la E/S que proporcionan capacidades especficas del sistema, tales como el control de
dispositivos de propsito especial para E/S de audio y video.

CLASES Y OBJ ETOS DE FLUJ O DE ENTRADA / SALI DA

La biblioteca iostreamcontiene muchas clases para manejar una amplia variedad de
operaciones de E/S. La clase istreamsoporta las operaciones de flujo de entrada. La clase
ostreamsoporta las operaciones de flujo de salida. La clase iostreamsoporta las operacio-
nes de flujo tanto de entrada como de salida.

La clase istreamy la clase ostreamderiva mediante herencia simple a partir de la
clase base ios. La clase iostreamderiva mediante herencia mltiple tanto de la clase is-
treamcomo 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 jerarqua de clases de flujo de E/S.

La sobrecarga de operadores (utilizacin de un operador para realizar ms de una
tarea) proporciona una notacin conveniente para la realizacin de la entrada/salida. El
operador de desplazamiento a la izquierda (<<) est sobrecargado para indicar el flujo de
salida y se denomina operador de insercin de flujo. El operador de desplazamiento a la
derecha (>>) est sobrecargado para indicar el flujo de salida y se denomina operador de
extraccin de flujo. Estos operadores se utilizan con los objetos de flujo estndar cin, cout,
cerr, clog, y comnmente 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 estndar que normalmente es el teclado. El operador de extraccin de
flujo, como se utiliza en la siguiente instruccin, 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 operacin de extraccin 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 informacin 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 estndar que normalmente es la pantalla. El operador de insercin de flujo, como se
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-6
utiliza en la siguiente instruccin, causa que al valor de la variable entera calificacion se le
d salida desde la memoria hacia el dispositivo de salida estndar:

cout <<calificacion;

Observe que el operador de insercin es lo suficientemente inteligente para saber el
tipo de calificacion (suponiendo que se haya declarado adecuadamente), por lo que no se
necesita especificar informacin adicional con dicho operador.

El formato general para el enunciado cout es el siguiente:

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

Como puede observar, despus de cout sigue una lista de elementos para escribirse,
los cuales estn separadas por el operador de insercin 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 travs del operador de
insercin 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
insercin de flujo <<.

Algunos sistemas acumulan informacin de salida en una memoria temporal (bfer
o buffer) hasta que haya suficiente informacin 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 estndar. Las salidas hacia el objeto cerr no se almacena en el bfer. Esto significa
que cada insercin de flujo de cerr causa que su salida aparezca inmediatamente; esto es
adecuado para notificar al usuario algn error en forma inmediata.

clog es un objeto de la clase ostream, y tambin se dice que esta enlazado al dispo-
sitivo de errores estndar. Las salidas de clog se almacenan en el bfer. Esto significa que
cada insercin a clog puede causar que su salida se conserve en un bfer hasta que ste se
llene o vace.

Elemento1 ElementoN

Elemento2

Elemento3

...


PANTALLA
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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 ifstreamhereda de istream, la
clase ofstreamhereda de ostreamy la clase fstreamhereda de iostream. En la figura 6.2 se
resumen las diversas relaciones de herencia de las clases relacionadas con la E/S. Existen
ms clases, en la jerarqua de clases de flujo de E/S completa, soportadas en la mayora de
las instalaciones, pero las clases que aqu se muestran proporcionan las capacidades que
necesitan casi todos los programadores. Si desea ms informacin 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 jerarqua de clases de flujo de E/S con las principales clases para el procesamiento de archivos.

FLUJO DE SALIDA

La clase ostreamde C++proporciona la habilidad para realizar salida formateada y
sin formato. Las capacidades para la salida incluyen: salida de tipos de datos estndar con
el operador de insercin de flujo, salida de caracteres con la funcin miembro put( ), sali-
da sin formato con la funcin 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 notacin cientfica y en notacin fija, salida de datos alineados en
campos de anchura indicados, salida de datos en campos rellenados con caracteres especi-
ficados y salida de letras maysculas en notacin cientfica y notacin hexadecimal.

OPERADOR DE I NSERCI N DE FLUJ O

El flujo de salida puede realizarse mediante el operador de insercin de flujo <<
sobrecargado. Dicho operador est sobrecargado para dar salida a elementos de datos de
tipos estndar: numrico, cadenas y valores de apuntador.

Ejemplo 6.1

El siguiente programa: SALUDOS1.CPP, muestra la salida de una cadena utilizando una sola ins-
truccin de insercin de flujo.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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 insercin de flujo.












CASCADA DEL OPERADOR DE I NSERCI N DE FLUJ O

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 mltiples 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 instruccin de insercin de flujo.
*/

#include <iostream.h> //Para cout

void main( void )
{
cout <<"Bienvenidos al I NSTI TUTO POLI TCNI CO NACI ONAL!" ;
}//Fin de main( )
/* El siguiente programa: SALUDOS2.CPP, muestra la salida de una cadena utilizando
varias instrucciones de insercin de flujo.
*/

#include <iostream.h> //Para cout

void main( void )
{
cout <<"Bienvenidos al " ;
cout <<"I NSTI TUTO POLI TCNI CO NACI ONAL! " ;
}//Fin de main( )
/* El siguiente programa: CASCADA.CPP, ilustra el uso del operador de insercin <<
utilizado en forma de cascada.
*/

#include <iostream.h> //Para cout

void main( void )
{
cout <<"15 ms 27 es: " <<( 15 +27 ) <<endl;
}//Fin de main( )
Salida:
Bienvenidos al INSTITUTO POLITECNICO NACIONAL!
Salida:
Bienvenidos al INSTITUTO POLITECNICO NACIONAL!
Salida:
15 ms 27 es: 42
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-9
( ( ( cout <<"15 ms 27 es: ") <<( 15 +27 ) ) <<endl );

es decir, << asocia de izquierda a derecha. Este tipo de puesta en cascada de los operadores
de insercin 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 expresin entre
parntesis del extremo izquierdo

( cout <<"15 ms 27 es: " )

enva la cadena de caracteres y devuelve una referencia a cout. Esto permite evaluar la ex-
presin que est entre parntesis en la parte media como

( cout <<( 15 +27 ) )

que enva el valor entero 100 y devuelve una referencia a cout. A continuacin la expresin
entre parntesis ms a la derecha se evala como

( cout <<endl );

que enva a la salida un salto a una nueva lnea, vaca a cout y devuelve una referencia a co-
ut. Esta ltima devolucin ya no se utiliza.

USO DE CARACTERES ESPECI ALES

La mayora de los programas que elaborar, visualizarn varias lneas de salida.
Cuando desea avanzar el cursor al principio de una nueva lnea, puede utilizar el carcter
nueva lnea ( '\n' ) en el flujo de salida. Cuando se inserta en el flujo de salida, se genera un
retorno de carro/salto de lnea (CRLF). C++le proporciona dos maneras de generar una
nueva lnea.

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

Ejemplo 6.4

El siguiente programa: DOSLI NEAS.CPP, visualiza la salida de dos cadenas en dos lneas, utilizan-
do la secuencia de escape '\n'.











/* El siguiente programa: DOSLI NEAS.CPP, muestra en la pantalla dos cadenas de
caracteres en dos lneas, utilizando el carcter de escape '\n'.
*/

#include <iostream.h> // Para cout

void main( void )
{
cout <<"Esta es la lnea uno.\nEsta es la lnea dos.";
}// Fin de main( )
Salida:
Esta es la lnea uno.
Esta es la lnea dos.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-10
Segundo, si no esta desplegando una cadena de caracteres, puede colocar el carcter
nueva lnea entre apstrofes, como se ve en el Ejemplo 6.5:

Ejemplo 6.5

El siguiente programa NVALI NEA.CPP visualiza los nmeros 1,0,0 y 1 en lneas diferentes:













En vez de utilizar el carcter nueva lnea, puede ut ilizar el manipulador de flujo
(ver este tema ms 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 informacin acumulada en la memoria temporal o bfer 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: NVALI NEA.CPP, visualiza los nmeros 1, 0, 0 y 1 en lneas
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 fcil.";
}// 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 <<"I NSTI TUTO POLI TCNI CO NACI ONAL!";
cout <<endl;
}//Fin de main( )
Salida:
1
0
0
1
Salida:
Bienvenidos al INSTITUTO POLITECNICO NACIONAL!
Salida:
El lenguaje C++ es ...
bastante fcil.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-11
Ejemplo 6.8

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
















OTROS CARACTERES ESPECIALES

En la leccin 3 pgina 3-24 (constantes de tipo carcter y cadena) hemos visto ya
los caracteres especiales, los repetiremos simplemente para tener una rpida referencia.

Carcter Propsito
\a Carcter alerta (o campana)
\b Carcter retroceso (backspace)
\f Carcter alimentacin de hoja (formfeed)
\n Carcter nueva lnea (newline)
\r Carcter retroceso de carro (carriage return)
(no alimenta nueva lnea)
\t Carcter de tabulador horizontal
(horizontal tab)
\v Carcter de tabulador vertical
(vertical tab)
\\ Carcter diagonal inverso (backslash)
\? Carcter interrogacin (question mark)
\ Carcter apstrofe
\ Carcter comillas
\0 Carcter nulo
\0OO Valor octal tal como \007
\xhhh Valor hexadecimal tal como \xFFFF


Ejemplo 6.9

El siguiente programa: ESPECI AL.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: EXPRESI ONES.CPP, muestra el uso de envo a la salida de valores
de expresiones.
*/

#include <iostream.h> //Para cout

void main( void )
{
cout <<"15 ms 27 es: " ;

//No se necesitan los parntesis, pero se utilizan para claridad
cout <<( 15 +27 ); //expresin
cout <<'\n';
}//Fin de main( )
Salida:
15 ms 27 es: 42
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-12













Como antes hemos dicho, la salida no es inmediatamente emitida al dispositivo, sino
ms bien se va acumulando en cierta rea de la memoria (bfer o buffer) asignada a tal dis-
positivo. Sin embargo, cuando se encuentra con el manipulador endl o bien una operacin
de lectura, el bfer es vaciado (enviar la informacin al dispositivo). Si desea vaciar inme-
diatamente el buffer asignado al dispositivo sin necesidad de dar un salto de lnea se puede
utilizar la palabra flush.

Ejemplo 6.10

El siguiente programa: FLUSH.CPP, ilustra el uso del manipulador flush para vaciar el bfer.












VI SUALI ZANDO NMEROS CON cout

Cuando quiera escribir informacin numrica fija, simplemente inserte los valores
numricos dentro del flujo de salida cout utilizando el operador <<.

Ejemplo 6.11

El siguiente programa: 1001.CPP despliega el nmero 1001 en su pantalla:







/* El siguiente programa: 1001.CPP, despliega el nmero 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 lnea aparece inmediatamente." <<flush;
cout <<"\nLo mismo sucede con esta lnea..." <<flush;
}// Fin de main( )
/* El siguiente programa: ESPECI AL.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 lnea aparece inmediatamente.
Lo mismo sucede con esta lnea...
Salida:
1001
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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
nmero 0.12345 en su pantalla.











VI SUALI ZANDO VARI OS VALORES CON UN cout

Cuando utiliza cout, puede utilizar el operador de insercin ms de una vez por
enunciado. La salida no genera ningn espacio entre los elementos.

Ejemplo 6.13

El siguiente programa: 1001BI S.CPP, usa el operador cuatro veces para desplegar el nmero 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 (Manipulacin de flujo).

VI SUALI ZANDO CARACTERES FI J OS CON cout

Para escribir informacin de caracteres, deber encerrar la informacin 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 nmero 0.12345 por pantalla. */

#include <iostream.h> // Para cout

void main( void )
{
cout <<0.12345;
}// Fin de main( )
/* El siguiente programa: 1001BI S.CPP, utiliza el operador <<cuatro veces para
desplegar el nmero 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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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:














VI SUALI ZANDO CADENA DE CARACTERES Y NMEROS CON cout

Ejemplo 6.15

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














Ejemplo 6.16

El programa siguiente: MSTR1001.CPP visualiza una cadena de caracteres y un nmero 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 lnea uno.\n" ;
cout <<"Este texto se encuentra " ;
cout <<"en la lnea dos.\n";
cout <<"Esta es la ltima lnea.";
}// Fin de main( )
/* El siguiente programa: CVALNUM.CPP, muestra como cout visualiza cadena de caracteres
y nmeros.
*/

#include <iostream.h> // Para cout

void main( void )
{
cout <<"cout le permite visualizar cadenas de caracteres, nmeros enteros\n";
cout <<"y de punto flotante.\n\n";
cout <<1001;
cout <<'\n';
cout <<1.2345;
}// Fin de main( )
Salida:
Esta es la lnea uno.
Este texto se encuentra en la lnea dos.
Esta es la ltima lnea.
Salida:
cout le permite visualizar cadenas de caracteres , nmeros enteros
y de punto flotante.

1001
1.2345
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-15













Ejemplo 6.17

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













UTI LI ZANDO cout PARA COMBI NAR DI FERENTES TI POS 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 nmeros 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
nmero, utilizando un solo cout.
*/

#include <iostream.h> // Para cout

void main( void )
{
cout <<"Mi nmero favorito es: " <<1001;
}// Fin de main( )
/* El siguiente programa: ENM1001.CPP, visualiza el nmero 1001 en medio de dos
cadenas de caracteres.
*/

#include <iostream.h> // Para cout

void main( void )
{
cout <<"El nmero " <<1001 <<" es mi favorito";
}// Fin de main( )
Salida:
Mi nmero favorito es: 1001
Salida:
El nmero 1001 es mi favorito
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-16
VI SUALI ZANDO OBJ ETOS VARI ABLE CON cout

Lo siguiente que deber aprender es cmo escribir informacin 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-
cin <<. Por ejemplo, si su programa ha definido voltaje, corriente y resistencia como obje-
tos variables, puede escribir sus respectivos valores insertndolos 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.



























SALI DA DE VARI ABLES char *

En la E/S estilo C es necesario que el programador proporcione informacin del tipo
de datos. C++determina automticamente 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 descripcin del programa.
cout <<"Este programa calcular el voltaje dada una corriente de 0.001 "
"amperes\ny una resistencia de 4700.0 ohms." <<endl <<endl;

// Clculo 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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-17
es de tipo char *. Supongamos que quiere imprimir el valor de ese apuntador, es decir, la
direccin de memoria del primer carcter de dicha cadena. Pero el operador <<ha sido so-
brecargado para que imprima los datos de tipo char * como cadenas terminadas en nulo. La
solucin es hacer una conversin 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 direccin).

Ejemplo 6.20

El siguiente programa: DI RCHAR.CPP, muestra la impresin de una variable char *
en formatos de cadena y direccin. Observe que la direccin se imprime como nmero
hexadecimal (base 16). En C++los nmeros hexadecimales comienzan con 0x o 0X.














SALI DA DE CARACTERES CON LA FUNCI N MI EMBRO put( ); put( ) EN CASCADA

La funcin miembro put( ) enva a la salida un carcter 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 carcter de nueva lnea. Como sucede con <<, la
instruccin anterior se ejecuta de esta forma debido a que el operador punto (.) asocia de
izquierda a derecha y la funcin miembro put( ) devuelve una referencia al objeto mediante
el que se realiz la llamada a put( ). La funcin put( ) tambin puede invocarse mediante
una expresin de valor ASCI I , como en cout.put( 65 ), lo cual tambin da salida a A.

E/S SIN FORMATO MEDIANTE read( ), gcount( ) y write( )

Aunque la idea de esta leccin, es tratar exclusivamente con el objeto flujo de salida
de datos, trataremos brevemente el flujo de entrada de datos.

/* El siguiente programa: DI RCHAR.CPP, muestra en pantalla el contenido de una variable
char * en formatos de cadena y de direccin.
*/

#include <iostream.h> //Para cout

void main( void )
{
char *cadena ="I NSTI TUTO POLI TCNI CO NACI ONAL";

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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-18
La entrada/salida sin formatose realiza con las funciones miembro read( ) y wri-
te( ). Cada una de ellas da entrada o enva a la salida algn nmero de bytes desde o hacia
un arreglo de caracteres que est en memoria. Estos bytes no tienen ningn formato. Se les
da entrada o salida simplemente como bytes sin formato. Por ejemplo, la llamada:

char buffer[] ="I NSTI TUTO POLI TCNI CO NACI ONAL";
cout.write( buffer, 10 );

enva 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
evala por la direccin de su primer carcter, la llamada

cout.write( "ABCDEFGHI J KLMNOPQRSTUVWXYZ", 10 );

despliega los primeros 10 caracteres de la cadena.

La funcin miembro read( ) introduce un nmero determinado de caracteres en un
arreglo. Si se leen menos caracteres que el nmero indicado, se establece la bandera failbit.
Pronto veremos la manera de determinar si se ha establecido failbit.

La funcin miembro gcount( ) reporta cuntos caracteres ha ledo la ltima opera-
cin de entrada.

Ejemplo 6.21

El siguiente programa: SI NFORMATO.CPP, muestra las funciones miembro read( ) y gcount( ) de
istreamy la funcin miembro write( ) de ostream. El programa utiliza read( ) para introducir 20 ca-
racteres (a partir de una secuencia de entrada ms larga) en el arreglo de caracteres buffer, se vale de
gcount( ) para determinar el nmero de caracteres que se introdujeron y emplea write( ) para enviar a
la salida los caracteres que estn en el buffer.


















/* El siguiente programa: SI NFORMATO.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 <<"I ntroduzca una oracin:\n" ;
cin.read(buffer, 20);

cout <<"\nLa oracin introducida fue:\n";
cout.write( buffer, cin.gcount( ) );
cout <<endl;
}//Fin de main( )
Salida:
Introduzca una oracin:
DABALE ARROZ A LA ZORRA EL ABAD

La oracin introducida fue:
DABALE ARROZ A LA ZO
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-19
REDIRECCIONANDO LA SALIDA DE cout

En realidad cout dirige la salida al dispositivo estndar (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 quisiramos 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 quisiramos enviarla a un archivo:

C:\>FLUSH.EXE >nombreArchivo

Si por alguna razn desea que la salida no sea redireccionable, por ejemplo, le agra-
dara que los mensajes de error que enve 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 enva la salida al dispositivo estndar 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 enva directamente al dispositivo asignado (como es el caso de cerr) sino que
la enva al rea bfer.

* El siguiente programa: CERR.CPP, utiliza el flujo de salida cerr para visualizar
el mensaje "Este mensaje siempre aparece en el dispositivo estndar stderr".
*/

#include <iostream.h> // Para cout

void main( void )
{
cerr <<"Este mensaje siempre aparece en el dispotivo estndar: stderr";
}// Fin de main( )
Salida:
Este mensaje siempre aparece en el dispotivo estndar: stderr
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-20
Ejemplo 6.23

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











MANIPULACIN DEL FLUJO

A la organizacin de la salida de un programa se le conoce con el nombre de forma-
teo de la salida. Las formas ms 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:

nombreObjetoI nvocador.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 funcin miembro setf( ) del
objeto de fl ujo:

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 estndar: stderr".
*/


#include <iostream.h> // Para cout

void main( void )
{
clog <<"Este mensaje NO siempre aparece inmediatamente en el dispositivo estndar: stderr";
}// Fin de main( )
Salida:
Este mensaje NO siempre aparece inmediatamene en el dispositivo estndar: stderr
EXAMEN BREVE 14
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-21
a. Cualquier bandera (indicador) establecida puede desactivarse. Para desactivar una ban-
dera usamos la funcin 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 envan al flu-
jo cout.
cout.unsetf( ios::showpos );

4. Mediante el uso de banderas(indicadores) como argumento de la funcin setiosflags( ).

a. Cualquier bandera (indicador) establecida puede desactivarse. Para desactivar una bande-
ra usamos la funcin 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 funcin que se invoca de manera no tradicional. A su vez,
la funcin manipuladora invoca una funcin miembro. Los manipuladores se colocan des-
pus del operador de insercin <<, como si la funcin 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 funcin miembro width( ) hacen exactamente lo mismo.
Invocamos al modificador setw( ) escribindolo despus del operador de insercin <<, co-
mo si lo furamos a enviar al flujo cout, y este a su vez invoca a la funcin miembro
width( ). Por ejemplo, lo que se muestra a continuacin despliega los nmeros 15, 25 y 35
usando la anchura de campo especificada:

cout <<I nicio <<setw( 4 ) <<15 <<setw( 4 ) <<25 <<setw( 6 ) <<30;

La instruccin anterior produce la siguiente salida:

I nicio 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 funcin miembro
precision( ). Sin embargo, las llamadas a setprecision( ) se escriben despus del operador
de insercin <<, tal como se hace con el manipulador setw( ). Por ejemplo, lo que sigue
despliega los nmeros que se listan empleando el nmero de dgitos despus 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 instruccin anterior produce la siguiente salida salida:

$10.30
$20.50
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-22
Al igual que con la funcin miembro precision( ) cuando establecemos el nmero de
dgitos despus del punto decimal empleando el manipulador setprecision( ) el efecto per-
siste hasta que otra llamada a setprecision( ) o precision( ) cambie el nmero de dgitos.

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 nmeros enteros.
Precisiones.
La anchura de campos.
Punto decimal y ceros a la derecha para flotante y doble.
La alineacin a la izquierda o derecha.
El caracter de relleno de una salida.
Los indicadores de formato (restablecimiento).
Vaciado de flujo.
Insercin de nuevas lneas en el flujo de salida y vaciado de flujo.
insercin de un carcter nulo en el flujo de salida y el salto de espacios en blanco en el flujo de
entrada.

Estas caractersticas se describen en las siguientes secciones.

CAMBI O 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 tambin 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 parmetro. El uso
de setbase( ), o cualquier otro manipulador con parmetro, requiere la inclusin del archivo
de encabezado <iomanip.h>. La base permanece igual hasta que se cambia explcitamente.

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 <<"I ntroduzca un nmero entero: ";
Salida:
Introduzca un nmero decimal: 456
456 en hexadecimal es : 1c8
456 en octal es : 710
456 en decimal es : 456
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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.

PRECI SI N DE PUNTO FLOTANTE (precision( ), setprecision( ))

Dependiendo de cuando fue escrito su compilador (versin), la precisin se toma
como el nmero de cifras significativas o el nmero de dgitos despus del punto decimal.
As, algunos ejemplos de setprecision( 2 ) segn la primera opcin son:

23. 2.2e7 2.2 6.9e-1 0.00069

Ejemplos en base a la segunda opcin 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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-24
En estas lecciones, cuando nos refiramos a precision, estaremos hablando de la se-
gunda opcin: nmero de dgitos despus del punto decimal.

Podemos controlar la precisin de los nmeros de punto flotante utilizando el mani-
pulador de flujo setprecision( ) o la funcin miembro precision( ). Una llamada a cualquie-
ra de stos establece la precisin para todas las operaciones de salida subsecuentes hasta
cambiar nuevamente la precision. La funcin miembro precision( ) sin argumentos devuel-
ve el valor de la precisin actual.

Ejemplo 6.26

El siguiente programa: PRECI SI ON1.CPP, ilustra el uso del manipulador setprecision( )



















Ejemplo 6.27

El siguiente programa: PRECI SI ON2.CPP, utiliza la funcin miembro precision( ) y el manipulador
setprecision( ) para imprimir una tabla que muestra la raz cuadrada de 2 con precisiones que var-
an de 0 a 9. (Ver salida a continuacin).












/* El siguiente programa: PRECI SI ON1.CPP, muestra el uso del manipulador setprecision( )
para indicar el nmero de dgitos 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:
Raz cuadrada de 2 con precisin 0-9.
Precisin establecida por la funcin miembro precision( ):
1
1.4
1.41
1.414
1.4142
1.41421
1.414214
1.4142136
1.41421356
1.414213562
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-25





































ANCHURA DE CAMPO (setw( ), width( ))

La funcin miembro width( ) de ios establece la anchura del campo (es decir, el n-
mero de posiciones de carcter con el que un valor deber enviarse a la salida o el nmero
de caracteres que deber introducirse) y devuelve la anchura anterior. Si los valores proce-
sados son ms pequeos que la anchura de campo, se insertan caracteres de relleno como
relleno. Un valor ms grande que el ancho indicado no se truncar, sino que se imprimir el
nmero completo.

/* El siguiente programa: PRECI SI ON2.CPP, utiliza la funcin miembro precision( ) y el
manipulador setprecision( ) para imprimir una tabla que muestra la raz cuadrada de 2
con precisiones que varan 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 )
<<"Raz 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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-26
Ejemplo 6.28

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




















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

Ejemplo 6.29

Varios de los programas anteriores visualizan nmeros en la pantalla. Para asegurar que los nmeros
se muestren correctamente, el programa debe de manejar los espacios antes y despus de los nme-
ros. Cuando utiliza cout y cerr para visualizar la salida, sus programas pueden especificar el nmero
mnimo de caracteres requeridos para mostrar la salida utilizando el manipulador setw( ). Para utili-
zar setw( ) especifique el nmero mnimo 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 mltiples valores, requerir utilizar setw( ) para cada
/* El siguiente programa: ANCHURA1.CPP, ilustra el uso de La funcin miembro cout.width( ). */

#include <iostream.h> // Para cout

void main( void )
{
cout <<"Mi nmero favorito es:";
cout.width( 3 );
cout <<1001 <<endl;

cout <<"Mi nmero favorito es:";
cout.width( 4 );
cout <<1001 <<endl;

cout <<"Mi nmero favorito es:";
cout.width( 5 );
cout <<1001 <<endl;

cout <<"Mi nmero favorito es:";
cout.width( 6 );
cout <<1001 <<endl;
}// Fin de main()
Salida:
Mi nmero favorito es:1001
Mi nmero favorito es:1001
Mi nmero favorito es: 1001
Mi nmero 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 nmero favorito es:" <<setw( 3 ) <<1001 <<endl;
cout <<"Mi nmero favorito es:" <<setw( 4 ) <<1001 <<endl;
cout <<"Mi nmero favorito es:" <<setw( 5 ) <<1001 <<endl;
cout <<"Mi nmero favorito es:" <<setw( 6 ) <<1001 <<endl;
}// Fin de main( )
Salida:
Mi nmero favorito es:1001
Mi nmero favorito es:1001
Mi nmero favorito es: 1001
Mi nmero favorito es: 1001
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-27
uno de ellos. Si el ancho es menor que el nmero a mostrar, C++toma la decisin correcta de
utilizar como ancho, el nmero de dgitos que el nmero tenga.

Ejemplo 6.30

El siguiente programa: ANCHURA3.CPP, es otro ejemplo en el que se utiliza setw( ). Ver la salida a
continuacin:



























Ejemplo 6.31

Dado un valor de corrientede 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 voltajeusando 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 lneas y muestra los encabezados
cout <<"\n\n\n\n"
<<setw( 15 ) <<" NOMBRE"
<<setw( 22 ) <<" DI RECCI N"
<<setw( 23 ) <<" TELFONO" <<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 )
{
// Definicin e iniciacin de variables
float voltaje =0.0;
float corriente =0.001;
float resistencia =4700.0;

Salida:




CORRIENTE RESISTENCIA VOLTAJE
- - - - - - - - - - - - - - - - - - - - - - - - - - -
0.001 4700.000 4.700
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-28
























Nota: Ms 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 funcin miembro width( ) tanto en la
entrada como en la salida. Observe que en la entrada se leer un mximo de un carcter menos que
la anchura, debido a que se hace la previsin para el carcter nulo que se colocar en la cadena de
entrada. Recuerde que la extraccin de flujo termina cuando se encuentra un espacio en blanco que
no est al inicio. El manipulador de flujo setw( ) tambin puede utilizarse para establecer la anchura
de campo.

Nota: cuando se pide al usuario que introduzca los datos, ste deber dar una lnea 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 continuacin.
// Clculo del voltaje
voltaje =corriente * resistencia;

// Muestra los ttul os. Se prepara la salida de los valores en formato decimal,
// justificado a la izquierda y con tres decimales de precisin.
cout.setf( ios::fixed|ios::left );
cout.precision( 3 );

cout <<"\n\n\n\n"
<<setw( 20 ) <<"CORRI ENTE"
<<setw( 20 ) <<"RESI STENCI A"
<<setw( 20 ) <<"VOLTAJ E" <<endl;

cout <<setw( 20 ) <<" ---------"
<<setw( 20 ) <<" -----------"
<<setw( 20 ) <<" -------"
<<endl;

// Muestra valores
//cout.precision( 3 ); Qu ocurre si se cambia la precisin 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 oracin:
Nuestra vida son los ros que van a parar a la mar.
Nues
tra
vida
son
los
ros
que
van
a
para
r
a
la
mar.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-29



















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

MANI PULADORES DEFI NI DOS POR EL USUARI O

Los usuarios pueden crear sus propios manipuladores de flujo.

Ejemplo 6.33

El siguiente programa: MANI PUSUA.CPP, muestra la creacin y el uso de los manipuladores de flu-
jo campana, retorno (retorno de carro), tabulador y finLinea. Los usuarios tambin pueden crear sus
propios manipuladores de flujo con parmetros consulte los manuales de su instalacin para seguir
las instrucciones sobre cmo hacer esto.















/* El siguiente programa: MANI PUSUA.CPP, ilustra el uso de los manipuladores sin parmetros:
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 funcin miembro flush)
ostreamfinLinea( ostream&salida )
{
return salida <<'\n' <<flush;
}//Fin de finLinea( )

//Manipulador tabulador(que utiliza la secuencia de escape \t)
ostreamtabulador( ostream&salida )
{
return salida <<'\t';
}//Fin de tabulador( )

/* El siguiente programa: ANCHURA5.CPP, ilustra el uso de a funcin miembro width( ).
*/

#include <iostream.h> //Para cout y cin

void main( void )
{
int ancho =5;
char cadena[ 10 ];

cout <<"I ntroduzca una oracin:\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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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 funcin 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 servan para indicar algo, dependiendo de si
contenan 0 o 1, por analoga con una bandera real que indica algo al estar izada o arriada.
En ingls 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 funcin setf( ) se com-
porta como se describe en la tabla 5.1.

La notacin ios:: de una bandera significa lo siguiente:

La palabra ios es abreviatura de input/output stream e indica que el significado de
trminos como fixed o showpoint es el que tiene cuando se usan con un flujo de entrada o
salida.
La notacin :: 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)
ostreamcampana( ostream&salida )
{
return salida <<'\a';
}//Fin de campana( )

//Manipulador retorno (que utiliza la secuencia de escape \r)
ostreamretorno(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( )
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-31
I NDI CADORES 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 enumeracin 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 operacin OR a nivel de bits, |, para combinar di-
versas operaciones en un solo valor long. Al llamar a la funcin 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 funcin flags( ) debe especificar un valor que represente los valores de todos los
indicadores. Por otro lado, la funcin setf( ) de un solo argumento especifica uno o ms
indicadores y los une mediante OR con los valores de indicadores existentes para formar un
nuevo estado de formato.

Tabla 5.1. I ndicadores de estado de formato para setf( )
Indicador de estado de formato Descripcin
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 nmero debe estar alineado
a la izquierda en un campo y la magnitud del nmero
debe estar alineada a la derecha en ese mismo campo
(es decir, los caracteres de relleno aparecen entre el
signo y el nmero).
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 nmero debe aparecer en
la salida al inicio del nmero (un 0 inicial para los
octales, 0x o 0X inicial para los hexadecimales).
ios::showpoint Especifica que los nmeros de punto flotante deben
aparecer en la salida con un punto decimal. Esto se
utiliza normalmente con ios::fixed para garantizar un
determinado nmero de dgitos a la derecha del punto
decimal.
ios::uppercase Especifica que se debe utilizar X mayscula en 0X
antes de un entero hexadecimal y E mayscula cuan-
do se representa un valor de punto flotante en nota-
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-32
cin cientfica.
Indicador de estado de formato Descripcin
ios::scientific Especifica que la salida de un valor de punto flotante
debe estar en notacin cientfica.
ios::fixed Especifica que la salida de un valor de punto flotante
debe estar en notacin de punto fijo con un nmero de
dgitos especfico a la derecha del punto decimal.

El manipulador de flujo con parmetros setiosflags( ) realiza las mismas tareas que
la funcin miembro setf( ). El manipulador de flujo resetiosflags( ) realiza las mismas tareas
que la funcin miembro unsetf( ). Para utilizar cualquiera de estos manipuladores de flujo
asegrese 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 ). Tambin es posible utilizar el manipulador
de flujo ws para especificar que hay que brincarse los espacios en blanco.

CEROS A LA DERECHA Y PUNTOS DECI MALES ( ios::showpoint )

El indicador showpoint se establece para forzar a que un nmero 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 precisin actual) cuando
s est establecido.

Ejemplo 6.34

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











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

Despus 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 impresin 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\nDespus de establecer el indicador de ios::showpoint\n";
cout.setf( ios::showpoint );

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-33






ALI NEACI 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 funcin 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 nmero (o la base cuando el indicador
ios::showbase esta establecido) deber estar alineado a la izquierda dentro del campo, la
magnitud del nmero deber estar alineada a la derecha y los espacios intermedios debern
estar rellenos con el carcter de relleno. Los indicadores left, right e internal estn conteni-
dos en el dato miembro esttico ios::adjustfield. El argumento ios::adjustfieldse debe pro-
porcionar como segundo argumento para setf( ) cuando se establecen los indicadores de
alineacin left, right o internal. Esto permite que setf( ) se asegure que solamente est esta-
blecido uno de los tres indicadores de alineacin (son mutuamente excluyentes)

Ejemplo 6.35

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













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 justificacin 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: DERI ZQ1.CPP, muestra el uso de los manipuladores setw( ), setiosflags( )
y resetiosflags( ), y las funciones miembro setf( ) y unsetf( ), para controlar la alineacin 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;

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-34

















Ejemplo 6.36

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







































cout <<"La justificacin a la derecha est predeterminada:\n"
<<setw( 10 ) <<x <<"\n\nUSO DE FUNCI ONES MI EMBRO"
<<"\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 PARMETROS"
<<"\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: DERI ZQ2.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 omisin, 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 carcter \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 omisin, se justifica a la derecha.
1 2 3

Este mensaje se justifica a la izquierda.
1 2 3
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-35
Ejemplo 6.37

El siguiente programa: RESTAURA.CPP, restaura la justificacin a la derecha que es el valor por
omisin, utilizando el manipulador resetiosflags( )

























Ejemplo 6.38

El siguiente programa: ESPACI OI NT.CPP, muestra el uso de los manipuladores de flujo setios-
flags( ) y setw( ) para especificar el espacio interno. Observe el uso del indicador ios::showpospara
forzar la impresin del signo de ms.


















RELLENO (fill( ), setfill( ))

La funcin miembro fill( ) especifica el carcter de relleno que se debe utilizar con
los campos alineados, si no se especifica ningn valor, se emplean espacios para el relleno.
La funcin miembro fill( ) devuelve el carcter de relleno anterior. El manipulador setfill( )
tambin establece el carcter de relleno.

/* El siguiente programa: ESPACI OI NT.CPP, muestra la visualizacin 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 justificacin a su valor por omisin.
*/

#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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-36
Ejemplo 6.39

El siguiente programa: RELLENO1.CPP, muestra el uso de la funcin miembro fill( ) y del manipu-
lador setfill( ) para controlar el establecimiento y restablecimiento del carcter de relleno. Ver salida
a continuacin.











































Ejemplo 6.40

El siguiente programa: PUNTOS.CPP, ilustra el uso de la funcin miembro fill( ) y del manipulador
setfill( )
/* El siguiente programa: RELLENO1.CPP, ilustra el uso de la funcin miembro fill( ) y del
manipulador setfill( ) para cambiar el carcter de relleno para los campos que sean mas
grandes que los valores que se estn 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 justificacin interna.\n"
<<" Utilizando el carcter 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 jusstificacin interna.
Utilizando el caracter predeterminado de relleno (espacio):
10000
10000
0x 2710

Utilizando varios caracteres de relleno:
*****10000
10000%%%%%
0x^^^^2710
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-37




























BASE DE FLUJ O I NTEGRAL (ios::dec, ios::oct, ios::hex, ios::showbase)

El miembro esttico 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 dems 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 showbasepara forzar la base de un valor entero que se va a
enviar a la salida. Los nmeros decimales se envan a la salida en forma normal, los nme-
ros octales se envan con un 0 inicial y los nmeros hexadecimales se envan con un 0x
inicial o con 0X inicial (el indicador uppercasedetermina cul opcin 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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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.
















NMEROS DE PUNTO FLOTANTE, NOTACI N CI ENT FI CA (ios::scientific, ios::fixed)

El indicador ios::scientific y el indicador ios::fixed estn contenidos en el dato
miembro esttico ios::floatfield (que se utiliza en forma similar a ios::adjustfield e
ios::basefielden setf( )). Estos indicadores se utilizan para controlar el formato de salida de
los nmeros de punto flotante. El indicador scientific se establece para forzar la salida de
un nmero de punto flotante en formato cientfico. El indicador fixed fuerza que un nmero
de punto flotante se despliegue con un nmero especfico de dgitos (tal como lo especifica
la funcin miembro precision( )) a la derecha del punto decimal. Si no estn establecidos
estos indicadores, el valor del nmero 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 nmeros de punto flotante.

Ejemplo 6.42

El siguiente programa: PUNTOFLOT1.CPP, muestra el despliegue de nmeros de punto flotante en
formatos fijo y cientfico utilizando setf( ) con dos argumentos con ios::floatfield. Ver salida a conti-
nuacin:
/* 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)
<<"I mprimiendo nmeros enteros precedidos por su base:\n"
<<x <<'\n'
<<oct <<x <<'\n'
<<hex <<x <<endl;
}//Fin de main()
Salida:
Imprimiendo nmeros enteros precedidos por su base:
100
0144
0x64
Salida:
Desplegado en formato predeterminado:
0.00123457 1.946e+09
Desplegado en formato cientfico:
1.234567e-03 1.946000e+09
Desplegado en formato predeterminado despus de unsetf( ):
0.00123457 1.946e+09
Desplegado en formato fijo:
0.001235 1946000000.000000
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-39


























Ejemplo 6.43

Otra opcin para visualizar valores flotantes en notacin de punto decimal fijo o notacin exponen-
cial (cientfica), 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 MAYSCULAS / MI NSCULAS (ios::uppercase)

El indicador ios::uppercase se establece para forzar que se enva a la salida una X o
E maysculas con los enteros hexadecimales o con los valores de punto flotante en nota-
cin cientfica, 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, cientfico 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 cientfico:\n"
<<x <<'\t' << y <<'\n';
cout.unsetf( ios::scientific );
cout <<" Desplegado en formato predeterminado despus 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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-40
Ejemplo 6.44

El siguiente programa: MAYSCULA.CPP, ilustra el uso del indicador ios::uppercase.













ESTABLECI MI ENTO Y RESTABLECI MI ENTO DE LOS I NDI CADORES DE FORMATO (flags( ),
setiosflags( ), resetiosflags( ))

La funcin miembro flags( ) sin argumentos devuelve simplemente (como valor
long) los valores actuales de los indicadores de formato. La funcin 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 funcin 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 funcin miembro setf( ) con dos argumentos long como en:

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

Primero borra los bits de ios::adjustfieldy luego establece el indicador ios::left. Es-
ta versin 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 funcin 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 funcin 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 )
<<"I mprimiendo letras maysculas en los exponentes de la\n"
<<"notacin cientfica y en los valores hexadecimales:\n"
<<4.345e10 <<'\n' <<hex <<123456789 <<endl;
}//Fin de main( )
Salida:
Imprimiendo letras maysculas en los exponentes de la
notacin cientfica y en los valores hexadecimales:
4.345e+10
75BCD15
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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, ostreame iostreamque estamos utilizando para E/S.

El indicador eofbit se establece automticamente para un flujo de entrada cuando se
encuentra el fin de archivo. Un programa puede utilizar la funcin 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 funcin miembro flags( ). */

#include <iostream.h> //Para cout

void main( void )
{
int i =1000;
doubled =0.0947628;

cout <<"El valor de la variable flags es: "
<<cout.flags( )
<<"\nI mprime 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 variableflags es: "
<<cout.flags( )
<<"\nI mprime datos int y double en el nuevo formato\n"
<<"especificado utilizando la funcin miembro flags:\n"
<<i <<'\t' <<d <<"\n\n";

cout.flags( formatoOriginal );
cout <<"El valor de la variable flags es: "
<<cout.flags( )
<<"\nI mprime 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 funcin 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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-42

cin.eof( );

devuelve truesi se ha encontrado el fin de archivo en cin, y falseen caso contrario.

failbit se establece para un flujo cuando sucede un error de formato en el flujo pero
no se ha perdido caracteres. La funcin miembro fail( ) determina si una operacin 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
prdida de datos. La funcin miembro bad( ) determina si ha fallado una operacin 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 funcin miembro good( ) devuelve true si las funciones bad( ), fail( ) y eof( )
devuelven false. Las operaciones de E/S slo deben realizarse en flujos buenos.

La funcin miembro rdstate( ) devuelve el estado de error de flujo. Por ejemplo, una
llamada a cout.rdstatedevolvera el estado de flujo que luego podra probarse por medio de
una instruccin 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 funcin 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 instruccin:

cin.clear( );

borra o limpia a cin y establece el flujo a goodbit. La instruccin:

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) estn establecidos, la funcin miembro operador! de-
vuelve true. Si badbit, failbit (o ambos) estn establecidos, la funcin miembro operator
void * devuelve false. Estas funciones son tiles en el procesamiento de archivos cuando se
est probando una condicin verdadera/falsa en la condicin de una estructura de selec-
cin o una estructura de repeticin.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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 operacin de entrada de datos errnea:"
<<"\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 nmero entero pero se introdujo un carcter: ";
cin >>x;

cout <<"\nDespus de una operacin de entrada de datos errnea:"
<<"\n cin.rdstate( ): " <<ci n.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 <<" Despus de cin.clear( )"
<<"\ncin.fail( ): " <<cin.fail( )
<<"\ncin.good( ): " <<cin.good( ) <<endl;
}//Fin de main( )
Salida:
Antes de una operacin de entrada de datos errnea:
cin.rdstate(): 0
cin.eof(): 0
cin.fail(): 0
cin.bad(): 0
cin.good(): 1

Se espera un nmero entero pero se introdujo un carcter: a

Despus de una operacin de entrada de datos errnea:
cin.rdstate(): 2
cin.eof(): 0
cin.fail(): 2
cin.bad(): 0
cin.good(): 0

Despus de cin.clear()
cin.fail(): 0
cin.good(): 1
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-44
ENLACE DE UN FLUJO DE SALIDA A UN FLUJO DE ENTRADA

Las aplicaciones interactivas involucran, por lo general, a un istreampara entrada y
a un ostreampara salida. Cuando aparece un mensaje de peticin en la pantalla, el usuario
responde dando los datos adecuados. Obviamente la peticin necesita aparecer antes de que
contine la operacin de entrada. Con el almacenamiento temporal de salida, sta aparece
solamente cuando el bfer est lleno, cuando la salida se vaca en forma explicita por re-
querimientos del programa, o bien en forma automtica al final del programa. C++propor-
ciona la funcin miembro tie( ) para sincronizar (es decir, enlazar) la operacin de un is-
treamy un ostreampara 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 automticamente esta operacin para crear un entorno
de entrada/salida estndar para el usuario. Sin embargo, el usuario podra enlazar explci-
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 PRECISIN

Dentro de la computadora, los nmeros son representados utilizando combinaciones
de UNOS y CEROS (dgitos binarios) Ya que una determinada clase tiene un nmero 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 precisin insuficiente. Por ejemplo, los valores de clase
flotante, proporcionan 6 o 7 dgitos 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 dgitos significativos, de tal manera
que el valor anterior se almacena completamente en la memoria.

Cuando trabaje con nmeros de punto flotante, debe de tener cuidado del hecho de
que sus valores son representados utilizando un nmero fijo de bits. De esta manera, es
imposible para la computadora, representar siempre un nmero 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, PRECI SE.CPP, ilustra la diferencia entre precisin sencilla y doble preci-
sin:
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-45




















Observe los valores mostrados y comprelos 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 ms significativo se utiliza para determinar el
signo de la variable. Si el bit ms 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 continuacin:

32767 0111 1111 1111 1111
+ 1 0000 0000 0000 0001
- 32768 10000 0000 0000 0000

/* El siguiente programa: PRECI SE.CPP, ilustra la diferencia entre precisin
sencilla y doble precisin.
*/

#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 precisin sencilla: " <<
setprecision( 19 ) <<aproximado <<endl;

cout <<"Valor en doble precisin : " <<
setprecision( 19 ) <<masAproximado <<endl;
}//Fin de main()
Salida:
Valor en precisin sencilla: 0.1234567910432815550
Valor en doble precisin : 0.1234567890987654380
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-46
Ejemplo 6.48

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















Observe como la suma de 32767 +1 =-32768y -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 INFORMACIN

Todas las operaciones de salida que se han visto hasta ahora harn que la informa-
cin se muestre en la pantalla de su monitor. Cmo imprimir su informacin en la impre-
sora? Para realizar la salida a la impresora en C++, debemos escribir el cdigo para crear
nuestro propio objeto digamos imprimir. A continuacin se muestra un objeto imprimir
que se desarroll para la plataforma DOS:
















Este cdigo trabajar solamente en plataformas DOS debido a la referencia especfi-
ca para el archivo de impresora PRN. Por el momento no es importante que entienda el
cdigo anterior orientado a objetos. Ya habr tiempo. El cdigo 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 cdigo define imprimir como un flujo de salida
// direccionndolo al puerto de su impresora (PRN) (slo para DOS).
//***********************************************************************
ofstreamimprimir; // Define imprimir como un flujo de archivos de salida

imprimir.open( "PRN" ); // Abre un archivo de impresin 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
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-47
Como puede observar, los elementos que se imprimirn se insertan dentro del flujo
imprimir usando el operador de insercin << 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: I MPRI MI R.CPP, cuya informacin 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 cdigo de definicin de flujo imprimir se ha integrado dentro de la funcin main( ) del pro-
grama. En resumen, para que este cdigo 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: I MPRI MI R.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 cdigo define print como un archivo de salida
// direccionndolo al puerto de su impresora (PRN) (slo para DOS).
//*********************************************************************
ofstream imprimir; // Define imprimir como un flujo de archivos de salida

imprimir.open( "PRN" ); // Abre un archivo de impresin 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 impresin
}// Fin de main( )
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-48
lo como cout para escribir la informacin en la impresora. Esto es porque nuestro objeto imprimir ha
heredado las mismas caractersticas y comportamiento contenidos en el objeto cout. Ambos son ob-
jetos de la clase iostreamestndar. Al final de main( ) encontrar el enunciado imprimir.close( ). Es-
te enunciado es necesario para cerrar el archivo de i mpresin.




MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-49
LO QUE NECESITA SABER

Antes de continuar con la siguiente leccin, asegrese de haber comprendido los
siguientes conceptos:

q q Las operaciones de E/S se realizan tomando en cuenta el tipo de los datos.
q q La E/S en C++ se realiza en flujos de bytes . Un flujo es simplemente una secuencia de bytes.
q q Los mecanismos de E/S del sistema mueven bytes desde los dispositivos hacia memoria y vice-
versa, en forma eficiente y confiable.
q q 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, nmeros de punto flotante, caracteres, ca-
denas y tipos definidos por el usuario.
q q C++ proporciona operaciones de E/S sin formato y formateadas. Las transferencias de E/S sin
formato son rpidas, 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.
q q El flujo de salida cout le permite visualizar caracteres y nmeros.
q q La salida de datos es a cout (el flujo de salida estndar), que por lo general es la pantalla de la
computadora, pero cout puede conectarse a otros dispositivos.
q q Su programa puede visualizar una nueva lnea utilizando \n o endl. Adems, su programa
puede utilizar otros caracteres especiales como \t para producir un tabulador.
q q 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.
q q Utilizando el flujo de salida cerr, su programa puede escribir mensajes al dispositivo estndar
de errores de su sistema operativo.
q q La obtencin de informacin hacia su computadora se llama lectura y la obtencin de informa-
cin de su sistema hacia afuera se llama escritura.
q q El enunciado C++usado para lectura es cin y el enunciado que se usa para escribir es cout.
q q 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 insercin de flujo <<.
q q El enunciado cout se puede usar para escribir cualquier informacin variable o fija. La informa-
cin numrica fija se escribe simplemente listando los valores numricos en la lista de elementos
de cout. Cuando se escribe informacin de caracteres fijos, la informacin escrita debe encerrar-
se entre comillas sencillas para caracteres individuales y doble comillas para cadenas de caracte-
res.
q q Cuando escriba informacin variable, el identificador de la variable deber listarse dentro del
enunciado cout. La informacin se escribir en la pantalla del monitor o impresora del sistema.
q q 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 impresin para escribir hacia la impresora.
q q 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.
q q El valor del manipulador de ancho de campo especifica el nmero de columnas de salida que
sern asignadas para el elemento que se escriba.
q q Deber incluir el archivo de encabezado <iomanip.h>cuando use el manipulador de E/S setw( ).
Adems, siempre use un diseo de pantalla para acomodar su resultado y determinar los valores
correctos de ancho de campo.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-50
q q La mayora de los programas de C++incluyen el archivo de encabezado <iostream.h>que con-
tiene la informacin bsica requerida por todas las operaciones de E/S de flujo.
q q El archivo de encabezado <iomanip.h>contiene informacin para la entrada/salida formateada
con manipuladores de flujo con parmetros.
q q El archivo de encabezado <fstream.h>contiene informacin para las operaciones de proces a-
miento de archivos.
q q La clase istreamsoporta las operaciones de entrada de flujo.
q q La clase ostreamsoporta las operaciones de s alida de flujo.
q q La clase iostreamsoporta las operaciones de entrada y de salida de flujo.
q q Las clases istreamy ostreamestn derivadas mediante herencia simple a partir de la clase base
ios.
q q La clase iostreamest derivada mediante herencia mltiple a partir de las clases istreamy os-
tream.
q q El operador de desplazamiento a la izquierda (<<) est sobrecargado para designar la salida de
flujo y se le menciona como el operador de insercin de flujo.
q q El operador de desplazamiento a la derecha (>>) est sobrecargado para designar la entrada de
flujo y se le menciona como el operador de extraccin de flujo.
q q El objeto cin de la clase istreamest enlazado al dispositivo de entrada estndar, que es nor-
malmente el teclado.
q q El objeto cout de la clase ostreamest enlazado al dispositivo de salida estndar, que es nor-
malmente la pantalla.
q q El objeto cerr de la clase ostreamest enlazado al dispositivo de errores estndar. Las salidas
hacia cerr no se almacenan en el bfer, y cada insercin a cerr aparece inmediatamente,
q q El manipulador de flujo endl enva un carcter de nueva lnea y vaca el bfer de salida.
q q El compilador C++determina automticamente los tipos de datos para la entrada y la salida.
q q Las direcciones se despliegan en forma predeterminada en formato hexadecimal.
q q Para imprimir la direccin que est en una variable de apuntador hay que hacer una conversin
mediante cast del tipo de apuntador a void *.
q q La funcin miembro put( ) enva un carcter a la salida. Las llamadas a put( ) se pueden poner
en cascada.
q q La entrada de flujo se realiza mediante el operador de extraccin de flujo >>. Este operador se
salta automticamente cualquier espacio en blanco que haya en el flujo de entrada.
q q El operador >> devuelve false cuando encuentra el fin de archivo dentro de un flujo.
q q La extraccin de flujo causa que el failbit se establezca cuando hay una entrada inadecuada, y el
badbit se establece si la operacin falla.
q q Es posible introducir una serie de valores utilizando la operacin de extraccin de flujo en un
encabezado de ciclo while. La extraccin devuelve 0 cuando se encuentra el fin de archivo.
q q 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 operacin de E/S ha fallado o ha sido satisfactoria.
q q La E/S sin formato se realiza mediante las funciones miembro read( ) y write( ). stas introdu-
cen o envan a la salida algn nmero de bytes hacia o desde memoria iniciando en una direc-
cin de memoria designada. Dichos bytes se introducen o envan a la salida como bytes sin for-
mato.
q q La funcin miembro gcount( ) devuelve el nmero de caracteres que se introdujeron mediante la
operacin de read( ) sobre ese flujo.
q q La funcin miembro read( ) introduce un nmero especfico de caracteres en un arreglo de ca-
racteres. failbit( ) se establece si se leen menos del nmero especificado de caracteres.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-51
q q Para cambiar la base en la que se envan 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 explcitamente.
q q El manipulador de flujo con parmetros setbase( ) tambin establece la base para la salida de
enteros. setbase( ) toma un argumento entero de 10, 8 o 16 para establecer la base.
q q La precisin de punto flotante puede controlarse mediante el manipulador de flujo setpreci-
sion( ) o la funcin miembro precision( ). Ambos establecen la precisin para todas las opera-
ciones de salida subsecuentes hasta la siguiente llamada de valor de precisin. La funcin mie m-
bro precision( ) sin argumentos devuelve el valor actual de la precisin.
q q Los manipuladores con parmetros requieren la inclusin del archivo de encabezado <ioma-
nip.h>.
q q La funcin miembro width( ) establece la anchura del campo y devuelve la anchura anterior.
Los valores que son ms pequeos que el campo se rellenan con caracteres de relleno. El esta-
blecimiento de anchura del campo se aplica solamente para la siguiente insercin o extraccin;
despus la anchura de campo se establece implcitarnente a 0 (para que los valores subsecuentes
se enven a la salida con el tamao necesario). Los valores que son ms grandes que un campo se
imprimen completamente. La funcin width( ) sin argumentos devuelve el establecimiento de
anchura actual. El manipulador setw( ) tambin establece la anchura.
q q Para la entrada, el manipulador de flujo setw( ) establece un tamao de cadena mximo, y si se
recibe una cadena ms grande, la lnea ms grande se divide en partes no mayores al tamao in-
dicado.
q q Los usuarios pueden crear sus propios manipuladores de flujo.
q q Las funciones miembro setf( ), unsetf( ) y flags( ) controlan los valores de los indicadores.
q q El indicador skipws indica que >> se debe saltar los espacios en blanco en un flujo de entrada.
El manipulador de flujo ws tambin se salta los espacios en blanco iniciales en un flujo de entra-
da.
q q Los indicadores de formato estn definidos como una enumeracin en la clase ios.
q q Las funciones miembro flags( ) y setf( ) controlan los indicadores de formato, pero muchos pro-
gramadores de C++ prefieren utilizar los manipuladores de flujo. La operacin OR al nivel de
bits, |, se puede utilizar para combinar varias opciones en un solo valor long. Llamar a la funcin
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.
q q La funcin flags( ) debe especificar un valor que represente los valores totales de todos los indi-
cadores. Por otro lado, la funcin setf( ) de un solo argumento especifica uno o ms indicadores
y realiza la operacin OR al nivel de bits con los valores de indicadores existentes para formar
un nuevo estado de formato.
q q El indicador showpoint se establece para forzar que un nmero de punto flotante se envie a la
salida con un punto decimal y el nmero de dgitos significativos que se especifican en la preci-
sin.
q q 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.
q q internal indica que el signo de un nmero (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 debern rellenarse con el carcter de relleno.
q q ios::adjustfield contiene los indicadores left, right e internal.
q q La funcin miembro fil1( ) especifica el carcter 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 carc-
ter de relleno anterior. El manipulador de flujo setfi1l( ) tambin establece el carcter de relleno.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-52
q q El miembro esttico 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 nmeros 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.
q q Establezca el indicador showbasepara forzar que la base de un valor entero aparezca en la sali-
da.
q q El dato miembro esttico ios::floatfield contiene los indicadores scientific y fixed. Establezca el
indicador scientific para enviar un nmero de punto flotante a la salida en formato cientfico. Es-
tablezca el indicador fixed para enviar un nmero de punto flotante a la salida con la precisin
que se especifica en la funcin miembro precision.
q q La llamada a cout.setf( 0, ios::floatfield ) restaura el formato predeterminado para el despliegue
de nmeros de punto flotante.
q q Establezca el indicador uppercasepara forzar que se enve a la salida una X o E maysculas con
los enteros hexadecimales o los valores de punto flotante en notacin cientfica, respectivamen-
te. Cuando el indicador ios::uppercase est establecido, causa que todas las letras de un valor
hexadecimal estn en maysculas.
q q La funcin miembro flags( ) sin argumentos devuelve el valor long del establecimiento actual
de los indicadores de formato. La funcin miembro flags( ) con un argumento long establece los
indicadores de formato especificados por el argumento y devuelve los valores de indicadores
anteriores.
q q La funcin miembro setf( ) establece los indicadores de formato que estn en su argumento y
devuelve los valores de indicadores anteriores como un valor long.
q q La funcin miembro setf ( long setbits, long resetbits ) limpia o borra los bits de resetbits y lue-
go establece los bits de setbits.
q q La funcin miembro unsetf( ) restablece los indicadores designados y devuelve el valor de los
indicadores antes de que se reactiven.
q q El manipulador de flujo con parmetros setiosflags( ) realiza las mismas funciones que la fun-
cin miembro flags( ).
q q El manipulador de flujo con parmetros resetiosflags( ) realiza las mismas funciones que la
funcin mie mbro unsetf( ).
q q Se puede probar el estado de un flujo por medio de los bits de la clase ios.
q q eofbit se establece para un flujo de entrada cuando se encuentra el fin de archivo durante una
operacin de entrada. La funcin miembro eof( ) se utiliza para determinar si se ha establecido el
eofbit.
q q failbit se establece para un flujo cuando sucede un error de formato en el flujo pero no se han
perdido caracteres. La funcin miembro fail( ) determina si ha fallado una operacin de flujo, y
normalmente es posible recuperarse de estos errores.
q q badbit se establece para un flujo cuando sucede un error que da como resultado la prdida de da-
tos. La funcin miembro bad( ) determina si una operacin de flujo ha fallado. Tales fallas son
serias por lo general no son recuperables.
q q La funcin miembro good devuelve true si las funciones bad( ), fail( ) y eof ( )devuelven false.
Las operaciones de E/S slo deben realizarse con flujos buenos.
q q La funcin miembro rdstate( ) devuelve el estado de error de un flujo.
q q La funcin miembro clear( ) normalmente se utiliza para restaurar el estado de un flujo a bueno
para que pueda continuar la E/S en ese flujo.
q q C++proporciona la funcin miembro tie( ) para sincronizar las operaciones de istream y os-
tream para asegurar que la salida aparezca antes de las entradas subsecuentes.

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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 ESPACI O = ;
Qu har el siguiente enunciado?
cout <<\n <<setw( 20 ) <<ESPACI O <<HOLA <<endl;
3. Qu har el siguiente enunciado?
cout <<\n <<setw( 20 ) << <<HOLA <<endl;
4. Cul 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 pginas separadas de salida a una impresora, qu debe hacer para que
avance la impresora a la segunda pgina una vez que se haya impreso la primera pgina?
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 alineacin 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 parmetros ____________ y ____________ pueden utilizarse para establecer y restablecer
los indicadores de estado del formato.
e. La mayora de los programas C++ deben incluir el archivo de encabezado _____________ que contiene la informacin bsi-
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 informacin para realizar el formato en memoria.
h. Cuando se utilizan manipuladores con parmetros se debe incluir el archivo de encabezado ________.
i . El archivo de encabezado ____________ contiene informacin para el procesamiento de archivos controlado por el usuario.
j. El manipulador de flujo _____________ inserta un carcter de nueva lnea en el flujo de salida y vaca el flujo de salida.
k. El archivo de encabezado _____________ se utiliza en programas que mezclan la E/S estilo C y C++.
l . La funcin 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 estndar estn dirigidas hacia los objetos de flujo __________ o _______________.
o. La clase _________ soporta las operaciones de salida.
p. El smbolo para el operador de insercin de flujo es _______________.
q. Los cuatro objetos que corresponden a los dispositivos estndar del sistema incluyen a __________, ______________,
_______________ y ______________.
r. El smbolo para el operador de extraccin de flujo es _______________.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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 precisin predeterminada para el despliegue de valores de punto flotante es ___________.
u. Cuando se establece, el indicador ___________ causa que los nmeros positivos se desplieguen con un signo ms.
9. Indique si lo siguiente es verdadero o falso. Si la respuesta es falsa explique por qu.
a. La funcin 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 insercin de flujo << y el operador de extraccin de flujo estn sobrecargados para manejar todos los tipos de
datos estndar incluyendo cadenas y direcciones de memoria (solamente la insercin de flujo) y todos los tipos de datos de-
finidos por el usuario.
c. La funcin miembro de flujo flags( ) sin argumentos reactiva todos los bits de indicadores de la variable de estado flags.
d. El operador de extraccin de flujo >> puede sobrecargarse con una funcin 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 insercin de flujo << puede sobrecargarse con una funcin 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 extraccin de flujo >> siempre se salta los caracteres de espacio en blanco iniciales del flujo
de entrada.
h. Las caractersticas de entrada y salida se proporcionan como parte de C++.
i . La funcin miembro de flujo rdstate( ) devuelve el estado del flujo actual.
j. El flujo cout est normalmente conectado con la pantalla.
k. La funcin 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 operacin de flujo, la funcin miembro bad devolver true.
n. La salida hacia cerr no se almacena en el bfer y la salida hacia clog si se almacena en el bfer.
o. Cuando se establece el indicador ios::showpoint, se fuerza a que los valores de punto flotante se impriman con la precisin
predeterminada de seis dgitos siempre y cuando no se haya cambiado el valor de la precisin, en cuyo caso los valores de
punto flotante se imprimen con la precisin especificada.
p. La funcin miembro put de ostream da salida al nmero de caracteres especificado.
q. Los manipuladores de flujo dec, oct y hex solamente afectan las siguiente operacin 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 instruccin debe imprimir el valor entero de c.

cout << c;

c. cout << Una cadena entre comillas;

PROBLEMAS
1. Utilizando diseo de pantalla, escriba un programa que muestre su primer nombre en la mitad de la
pantalla del monitor .
2. Use el diseo de pantalla para escribir un programa que muestre su primer nombre en la esquina
superior izquierda de la pantalla usando caracteres con seis lneas de alto.
3. Escriba un programa que genera un rectngulo cuyo centro se localice a la mitad de la pantalla.
Construya el rectngulo de 8 lneas 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 SEMESTRE
-------------------- -----------------------------------------
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 instruccin que realice la tarea indica-
da.
a. Enve a la salida la cadena Introduzca su nombre: .
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-55
b. Establezca un indicador que cause que el exponente en notacin cientfica y las letras en valores hexadecimales se impriman
en maysculas.
c. Enva a la salida la direccin de la variable cadenade tipo char *.
d. Establezca un indicador para que los valores de punto flotante se impriman en notacin cientfica.
e. Enve a la salida la direccin de la variable enteroPtr de tipo int *.
f. Establezca un indicador para que cuando se enven valores enteros a la salida, se despliegue la base entera para los valores
octales y hexadecimales.
g. Enve a la salida el valor apuntado por floatPtr de tipo float *.
h. Utilice una funcin miembro de flujo para establecer el carcter de relleno a * para imprimir en campos cuya anchura sea
mayor que la de los valores que se envan a la salida. Escriba una instruccin separada para hacer esto con un manipulador
de flujo.
i . Enve a la salida los caracteres O y K en una instruccin mediante la funcin put de ostream.
j. Utilice la funcin miembro read de istream para introducir 50 caracteres en el arreglo linea de tipo char.
k. Utilice la funcin miembro gcount de istream para determinar el nmero de caracteres que se introducen en el arreglo de ca-
racteres linea por medio de la ltima llamada a la funcin miembro read de istream, y enve a la salida a ese nmero de ca-
racteres utilizando la funcin miembro write de ostream.
l . Escriba instrucciones separadas para vaciar el flujo de salida por medio de una funcin miembro y un manip ulador de flujo.
m. Enve a la salida los siguientes valores: 124, 18.376, Z, 1000000 y cadena.
n. Imprima el ajuste de precisin actual utilizando una funcin miembro.
o. Imprima 1.92, 1.925, 1.9258 con 3 dgitos de precisin 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 dgitos.
s. Utilice las variables enteras x e y para especificar la anchura de campo y precisin 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 instruccin para cada una de las siguientes indicaciones:
a. Imprima el entero 40000 alineado a la izquierda en un campo de 15 dgitos.
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 dgitos con ceros iniciales.
8. Escriba un programa que imprima valores de apuntador utilizando conversiones mediante cast de
todos los tipos de datos enteros. Cules imprimen valores extraos? Cules causan errores?
9. Escriba un programa para probar el resultado de la impresin del valor entero 12345 y el valor de
punto flotante 1.2345 en varios tamaos de campo. Qu sucede cuando los valores se imprimen en
campos que contienen menos dgitos que los valores?
10. Escriba un programa que imprima el valor 100.453627 redondeado al dgito ms cercano, a dci-
mos, centsimos, milsimos y diezmilsimos.
11. Escriba un programa que convierta temperaturas Fahrenheit enteras, desde 0 hasta 212 grados, a
temperaturas Celsius de punto flotante con 3 dgitos de precisin. Utilice la formula

celsius=5.0 / 9.0 * ( fahrenheit 32 );

para realizar el clculo. La salida debe imprimirse en dos columnas alineadas a la derecha, y las tempera-
turas Celsius debern 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 carcter para cada carcter. Utilice los manipu-
ladores de flujo dec, oct y hex para imprimir los valores enteros.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-56
EXAMEN BREVE 14

1. El archivo que deber incluir para usar cout es _____________________.
2. El operador que debe emplear para insertar informacin dentro del flujo cout es el operador
______________________.
3. Escriba un enunciado cout para mostrar su nombre como una cadena fija de informacin.
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
numerojustificado a la izquierda dentro de un ancho de campo de 10 columnas y una precisin
de 3 lugares decimales.
3. Explique la diferencia entre usar una \n en comparacin con un endl dentro de un enunciado
cout.
4. Qu salidas se producenn cuando se ejecutan las siguientes lneas?

cout << *;
cout.width( 5 );
cout << 123 << * << 123 <<* << endl;
cout << * << setw( 5 ) << 123 << * << 123 << * << endl ;
5. Qu salidas se producen cuando se ejecutan las siguientes lneas?

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 lneas?

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 lnea?

cout << * << setw( 3 ) << 12345 << * << endl ;
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-57
EXAMEN BREVE 16

1. Al formatear salidas, se utilizan las siguientes banderas con la funcin 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 informacin dentro del flujo cout es el operador
de insercin de flujo <<.
4. Lo siguiente es un enunciado cout para mostrar mi nombre como una cadena fija de informa-
cin.
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 precisin 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 comparacin con endl dentro del enunciado cout es
que la secuencia de escape \n slo genera una CRLF, mientras que el manejador endl genera
un CRLF y vaca 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:

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 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 *
Slo hay un espacio entre el * y el + en la segunda lnea. Los dems huecos contienen exactamente dos ca-
racteres en blanco cada uno.
7. La salida es la siguiente:
*12345*
Observe que se enva a la salida el entero completo aunque ello requiera ms 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 nmeros de punto flotante no se desplieguen en notacin e, es
decir, en notacin cientfica.Al establecer esta bandera, se desactiva ios::scientific.
b. ios::scientific Establecer esta bandera hace que los nmeros de punto flotante se desplieguen en notacin e, es
decir, en notacin cientfica. 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 ms 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 funcin 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 funcin miembro width( ). Es decir, si sobran espacios en blanco, se colocan despus de la salida. Al
establecer esta bandera, se desactiva ios::right.

También podría gustarte