Anuncios Google

Controles de flujo (Parte 1)

Tutoriales de Programaciones

Una de las cosas que más me gusta de C++ respecto a C es la forma de tratar los controles de flujos (streams), conocerlos, es una forma simple y potente de mostrar y recibir datos.

 

Los flujos están incluidos en la librería iostream, la cual tiene sobrecargado el operador << en los principales tipos de datos (int, double, string, etc...). Tipos de flujos más comunes:

  • cout : Por defecto salida a pantalla. (sería el printf de c)
  • cin: Por defecto entrada del teclado. (sería el scanf de c)
  • cerr: Se usa para el tratamiento de errores y también por defecto es a pantalla.

//Ejemplo 1
#include <iostream>
void main()
{
    std::cout << "Hola mundo" << std::endl;
}


Nota: endl representa un retorno de linea, también se puede poner el clásico "\n"

Se puede omitir el "std::" si usamos el ámbito global de espacio de nombre (name spaces), al hacerlo si nos referimos a cualquier flujo, el compilador asumirá en ámbito definido.


//Ejemplo 2
#include <iostream>
using namespaces std;
void main()
{
    cout << "hola mundo" << endl;
}


Los flujos funcionan con unos indicadores (flags), que podemos modificar para mostrar la información con un determinado formato, o también leerla. Estos flags, tan sólo tenemos que ponerlos en el stream para que actuen.

Incluyo aquí el módulo de manipuladores de entrada/salida (iomanip). En este caso, no haría falta porque se hace todo a través de flags, es para mostrar también una forma alternativa de hacerlo, a través del métodos del objeto cout; cout.setbase(). En el siguiente ejemplo SÍ necesitaremos iomanip.


//Ejemplo 3
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{ 
    int dato = 1023;
    cout << "El dato en decimal es " << dato << endl; //Decimal está por defecto
    cout << "El dato en decimal sigue siendo " << dec << dato << endl;
    cout << "El dato en hexadecimal es " << hex << dato << endl; //Es = que poner ios::hex
    //Otra forma de ponerlo, usando el método cout.setbase() en vez de poner "oct"
    //Para ello se ha usado la unidad iomanip
    cout << "El dato en octal es " << setbase(8) << dato << endl;
    //Aquí volvemos a poner el valor decimal si quisieramos seguir
    cout.setf(ios::dec, ios::basefield);
    // (.....)
}


 

Este ejemplo mostraría lo siguiente:

El dato en decimal es 1023

El dato en decimal sigue siendo 1023

El dato en hexadecimal es 3ff

El dato en octal es 1777

 


Un último ejemplo de cout en el que vamos a hacer una presentación de un texto y a mostrar un error por cerr


//Ejemplo 4
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
 
int main()
{
    string tipos[] = {"Gasolina", "Alcohol", "Tabaco"};
    float totales[] = { 1325.42331, 859, 1560.38};
    const float PI = 3.14159;
 
    cout << "PI vale " << PI << endl;
    //"fixed" activa el modo coma flotante
    //También se podría usar setiosflags(ios::fixed)
    cout << "PI con 2 decimales " << fixed << setprecision(2) << PI << endl << endl;
 
    for (int n = 0; n < 3; n++) {
        //Alineación izda, carácter de relleno y ancho
       cout << setiosflags(ios::left) << setfill('-') << setw(12);
       cout << tipos[n];
       //Alineación a la derecha
       cout << resetiosflags(ios::left) << setw(9);
       cout << totales[n] << endl;
    }
    cerr << "ERROR: Ya me he cansado";
}


La salida sería:
PI vale 3.14159
PI con 2 decimales 3.14

Gasolina------1325.42
Alcohol--------859.00
Tabaco--------1560.38
ERROR: Ya me he cansado

Nota: Aunque debido a que la fuente de éste HTML no tiene ancho fijo, no se aprecia, pero el listado está justificado verticalmente.

Para que veais la utilidad de cerr, ejecutar el ejemplo de la siguiente forma:
./ejemplo4 2> /tmp/error.log

Con esto le decimos a la shell que los errores nos los dirija al fichero error.log, no mostrandose en pantalla, permitiendo así llevar un buen seguimiento de los errores de las aplicacioens que diseñemos.

En la siguiente parte, os hablaré de cin y usar un fichero como salida a través de streams.

4.68182
Tu voto: Ninguno Votos totales: 4.7 (22 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ziprinet

Muy bien, muchisimas

Muy bien, muchisimas gracias. Pues nada mas, por ahora. Seguire investigando...que es lo divertido!!! y util.

 

Saludos, y de nuevo gracias.


Intentando aprender algo de scene... Indeciso

Imagen de ziprinet

Buenas, soy novato en esto.

Buenas, soy novato en esto. Tenia vagos conocimientos de C y recordando y practicando, poco a poco, pues he ido avanzando pero C++ se me empieza a complicar. Todo esto del "cout" es completamente nuevo para mi.

Creo entender que esto de los flujos es como una funcion que tiene como parametros otras funciones, es decir, llamamos a cout y utilizamos como sus parametros las funciones fixed, left, set precision... No se si me aproximo a la realidad y si me explico bien, ¿estoy en lo correcto?

Dices que estos flujos vienen incluidos dentro de la libreria iostream, ¿¿¿como puedo acceder a ella??? Supongo que hay una ayuda para cada libreria donde vienen detallados todos los flujos, funciones, parametros... y su finalidad. Utilizo el compilador DEV-C++ que habeis posteado aqui, ¿¿¿como accedo a esta ayuda, si existe realmente???

Todas estas preguntas me rondaron por la cabeza debido al cout << resetiosflags(ios::left) << setw(9); no entiendo como funciona y justifica a la derecha. Probando, si hago un cout << right << setw(9); pues obtengo el mismo resultado, ¿como actua este reset? Es que no lo veo... Vergüenza


Gracias por vuestra paciencia y por estos fantasticos tutoriales!!!

PD-. Ojala algun dia pueda ofrecer algo de utilidad a vuestra fantastica comunidad. De nuevo, gracias Scenebeta!!!

 

 

 


Intentando aprender algo de scene... Indeciso

Imagen de pspgorrister

Creo entender que esto de

Creo entender que esto de los flujos es como una funcion que tiene como parametros otras funciones, es decir, llamamos a cout y utilizamos como sus parametros las funciones fixed, left, set precision... No se si me aproximo a la realidad y si me explico bien, ¿estoy en lo correcto?

El concepto de flujos es muy común para la gente que usa UNIX o GNU/Linux, es muy común usarlo en la shell. Tan sólo imagínate que son datos que van de un lado a otro, por defecto la salida estándar normal y de error es la pantalla, y la entrada es el teclado, aunque eso se puede cambiar. Los datos van hacia la pantalla
cout << "Hola mundo";
O pueden venir del teclado

cout << "Ahora introduce tu nombre y apellido";
cin >> nombre;
cin >> apellido;

En realidad es un pequeño truco y se usan los operadores sobrecargados "<<" y ">>" para dar la sensación de "flujo", pero eso es otra historia y debería ser contada en otra ocasión...

Dices que estos flujos vienen incluidos dentro de la libreria iostream, ¿¿¿como puedo acceder a ella??? Supongo que hay una ayuda para cada libreria donde vienen detallados todos los flujos, funciones, parametros... y su finalidad. Utilizo el compilador DEV-C++ que habeis posteado aqui, ¿¿¿como accedo a esta ayuda, si existe realmente???

con sólo poner
#include <iostream>
ya la tienes disponible. No sé que ayuda trae Dev-c++ (prefiero el code:blocks), aunque puedes ir a www.cplusplus.com y ahí tienes toda la documentación clasificada, eso sí, en inglés.

Todas estas preguntas me rondaron por la cabeza debido al cout << resetiosflags(ios::left) << setw(9); no entiendo como funciona y justifica a la derecha. Probando, si hago un cout << right << setw(9); pues obtengo el mismo resultado, ¿como actua este reset? Es que no lo veo...

A un flujo tu le puedes poner un estado activo, que escriba los números en hexadecimal, que justifique a la derecha, etc. Si ese estado "lo reseteas" se queda el estado por defecto. El hecho de usar un "setf", o lo que es lo mismo "setear" un valor, viene por comodidad si lo tienes que usar varias veces, en el ejemplo de alinear el texto a la derecha, si tienes que poner 30 lineas, te ahorras el teclear 30 "right". Seteas el flag de alineación a la derecha y luego al terminar las 30 lineas, lo reseteas para que siga escribiendo normal.

Gracias por vuestra paciencia y por estos fantasticos tutoriales!!!

Denada, da gusto cuando le dan a uno las gracias, y ves que los tutos son de ayuda :D

PD-. Ojala algun dia pueda ofrecer algo de utilidad a vuestra fantastica comunidad. De nuevo, gracias Scenebeta!!!

Seguro que podrás, cuando entiendas algo que no esté en ningún tutorial todavía, no dudes en ponerlo.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.