domingo, 1 de agosto de 2010

Banderas de I/O y Manipuladores

Banderas de I/O

En esta sección abordaremos de manera más directa el tema sobre el control de formato para los stream de C++. Específicamente, veremos las tres diferentes formas que existen en C++ para manipular las banderas relacionadas a los stream y que nos permitirán gobernar de una manera más precisa la forma para representar datos de salida. En ese sentido, veremos que la primera de las forma que nos permitirá el formateo sera a través de las funciones flags(), setf() y unsetf(), la segunda y la tercera forma las encontraremos en ciertos manipuladores directos definidos en las librerías y .

(i) Banderas de formato:

C++ define algunas banderas de formato para entradas y salidas estándar, las cuales pueden ser manipuladas a través de la funciones (métodos) flags(), setf(), y unsetf(). Por ejemplo,

cout.setf(ios::left);

activa la justificación a la izquierda para todas las salidas dirigidas hacia cout.


A continuación se muestra una tabla de referencia de las banderas de I/O.

Tabla I/O : 02, banderas de formato
Bandera Descripción
boolalpha Los valores booleanos pueden ser leídos/escritos usando las palabras "true" y "false"
dec Los valores numéricos se muestran en formato decimal
fixed Números de punto flotante se despliegan en forma normal
hex Los valores numéricos se muestran en formato hexadecimal
left La salida es justificada por la izquierda
oct Los valores numéricos se muestran en formato octal
right La salida es justificada por la derecha
scientific Números de punto flotante se despliegan en notación científica
showbase Despliega la base de todos los valores numéricos
showpoint Despliega el punto decimal y extra ceros, aún cuando no sean necesarios
showpos Despliega el símbolo de más antes de valores positivos
skipws Descarta caracteres de espaciado (espacios, tabuladores, nuevas líneas) cuando se lee desde un stream
unitbuf Descarga el buffer despues de cualquier inserción
uppercase Despliega la "e" en notaciones científicas y la "x" en notaciones decimales como letras mayúsculas


Manipulando la lista de banderas de I/O de C++ (mostrada arriba) se pueden controlar los aspectos relacionados a la forma con la cual se desean presentar los datos en la salida. Por ejemplo, el programa que se muestra en seguida, activa la bandera boolalpha para mostrar los resultados de operaciones booleanas como "true" o "false" en lugar de "0" o "1" como es lo normal.

// Programación con C++
// programa Banderas01.cpp;
// probado en Dev-Cpp Versión 4.9.9.2

#include

using namespace std;

int main(int argc, char *argv[])
{
cout << "0 > 1 ? " << '\t' << (0 > 1) << endl;
cout << "5 > 1 ? " << '\t' << (5 > 1) << endl;

cout.setf(ios::boolalpha); // activar bandera
cout << "0 > 1 ? " << '\t' << (0 > 1) << endl;
cout << "5 > 1 ? " << '\t' << (5 > 1) << endl;

cin.get();
return 0;
}

(2) Manipuladores

Las banderas también pueden manipularse directamente usando los siguientes manipuladores. Seguramente usted ya estará familiarizado con el manipulador endl, el mismo puede darle una idea de cómo son usados los manipuladores. Por ejemplo, usted puede establecer la bandera de números decimales usando el comando:

cout <<> 

La tabla que se muestra en seguida corresponde a los manipuladores definidos en .

Tabla I/O : 03, manipuladores en
Manipulador Descripción Entrada Salida
bollalpha Activa la bandera boolalpha X X
dec Activa la bandera dec-imal X X
endl Escribe caracter de cambio de línea --- X
ends Escribe el caracter null --- X
fixed Activa la bandera fixed (para números reales) --- X
flush Descargar el stream --- X
hex Activa la bandera hex-adecimal X X
internal Activa la bandera interna --- X
left Activa la bandera left (izquierda) --- X
nobollalpha Desactiva la bandera boolalpha X X
noshowbase Desactiva la bandera showbase --- X
noshowpoint Desactiva la bandera showpoint --- X
noshowpos Desactiva la bandera showpos --- X
noskipws Desactiva la bandera skipws X ---
nounitbuf Desactiva la bandera unitbuf --- X
nouppercase Desactiva la bandera uppercase --- X
hex Activa la bandera oct-al X X
left Activa la bandera de justificar derecha --- X
scientific Activa la bandera scientific --- X
showbase Activa la bandera showbase --- X
showpoint Activa la bandera showpoint --- X
showpos Activa la bandera showpos --- X
skipws Activa la bandera skipws X ---
unitbuf Activa la bandera unitbuf --- X
uppercase Activa la bandera uppercase --- X
ws Limpiar cualquier espacio al inicio X ---


El programa que se muestra en seguida es un ejemplo de como emplear manipuladores directos para formatear salidas al stream estándar de salida ( cout ). En el mismo, se emplea el manipulador boolalpha para que los resultados de la operaciones logicas sean textuales, o sea, true o false y los manipuladores dec, hex y oct.

// Programación con C++
// programa Banderas02.cpp;
// probado en Dev-Cpp Versión 4.9.9.2

#include

using namespace std;

int main(int argc, char *argv[])
{
cout << boolalpha;
cout << "0 > 1 ? " << '\t' << (0 > 1) << endl;
cout << "5 > 1 ? " << '\t' << (5 > 1) << endl;

cout << dec << 2048 << endl;
cout << hex << 2048 << endl;
cout << oct << 2048 << dec << endl;

cin.get();
return 0;
}

(3) Manipuladores de la libreria 'iomai....

Por último, y para terminar esta sección, hablaremos de los manipuladores definidos en la librería . Estos operan directamente igual que los que se vierón anteriormente, salvo que son parametrizados, es decir, operan en línea de salida mediante el operador <<, pero los mismos operan a manera de funciones, o sea con parámetros.


Tabla I/O : 04, manipuladores en
Manipulador Descripción Entrada Salida
resetioflags( long f ) Desactiva las banderas especificadas por f X X
setbase( int base ) Establece la bases numérica a base --- X
setfill( int ch ) Establece caracter de relleno a ch --- X
setioflags( long f ) Activa las banderas especificadas por f X X
setprecision( int p ) Establece el número de digitos de precisión a p --- X
setw( int w ) Establece la longitud de campo a w --- X


Atendiendo a las tablas de banderas, así como a las tablas de manipuladores para las mismas mostradas arriva, usted puede (con practica y perceverancia) lograr salidas con muy buena presentación hacia los dispositivos estándar. Por ejemplo, el programa que se mostrará a continuación muestra una de las formas de emplear manipuladores para formatear números de punto flotante, en el programa se despliega una lista de valores numéricos y se establece el campo de salida a una longitud de 12 caracteres y dos decimales.

// Programación con C++
// programa Banderas03.cpp;
// probado en Dev-Cpp Versión 4.9.9.2

#include
#include
using namespace std;

int main()
{
double data[] = { 347.25, 45.75, 124.50, 456.80, 1500.90 };
double total;
int ancho = 12;

cout.precision(2);
cout.setf(ios::fixed);

for (int c = 0; c < 5; c++) {
cout << setw(ancho) << data[c] << endl;
total += data[c];
}
cout.fill('-');
cout << setw(ancho) << "" << endl;
cout.fill(' ');
cout << setw(ancho) << total << endl;

cout << "Por favor oprime Enter...";
cin.get();
return 0;
}

FUENTE: http://es.wikibooks.org/wiki

No hay comentarios:

Publicar un comentario