Indicadores de progreso en C

Luego de leer el artículo C/C++: Indicador de progreso de La plaga Tux, me vino a la mente ese indicador de progreso que tiene ese aspecto de “barrita” girando sobre su propio eje.

Entonces, tiempo libre mediante, en principio tomé el artículo original y porté el código de C++ a C (nada de otro mundo). Tal artículo me hizo recordar que hay vida más allá del \n recordándome el \r. Pero como una cosa va encadenada a la otra, también me hizo recordar el \b.

Para quienes hasta aquí me leen perdidos o necesitan un refresco de su memoria, les recuerdo que en el formato de impresión se pueden utilizar varias secuencias de control de cursor:

  • \n: nueva línea
  • \r: retorno de carro
  • \b: backspace
  • \t: tab
  • etc.

Con esto, ya tenemos todos los fundamentos para que puedas entender los ejemplos.

  • Indicador de progreso portado de C++ a C de la versión original del artículo:
#include    <stdlib.h>
#include    <stdio.h>

int main ( int argc , char **argv )
{
    const short operations = 500;
    float     inc = 100.0f / ((float)operations-1.0);
    float     progress = 0.0f;
    short     i,pos=0;

    for ( i=0; i<operations; i++ ) {
        progress+=inc;
        fprintf( stdout, “Progreso: %d\r , (int)progress );    fflush(stdout);
        usleep(500000);
    }

    return EXIT_SUCCESS;
}

  • “Barrita” de progreso girando sobre su propio eje:
#include    <stdlib.h>
#include    <stdio.h>
#include    <string.h>

int main ( int argc , char **argv )
{
    const char  s[] = “-\\|/-\\|/”;
    const short operations = 500;
    short     i,pos=0;

    for ( i=0; i<operations; i++ ) {
        fprintf( stdout, “Progreso: %c\r , s[pos] );   fflush(stdout);
        pos++;
        if ( pos>=strlen(s) )
            pos=0;
        usleep(500000);
    }

    return EXIT_SUCCESS;
}

Espero que haya servido, a mi al menos me sirve para agregarlo a mi base de conocimientos (mi blog :P )

3 comentario en este artículoDeje el suyo
  1. WOW! Genial post… siempre me pregunté como hacían para ir imprimiendo sin que saltara a la siguiente línea. Muchas gracias, voy a tenerlo en los marcadores por si lo necesito algún día ;)

  2. Gracias por hacer referencia a mi artículo. También me interesaba mucho hacer un indicador como el que comentas, así que me ha venido de perlas ;)

  3. Bueno, me alegra que les haya sido util… son esos apuntes que nunca están de más ;-)

Deje su comentario

Por favor, ingrese su nombre

Por favor, ingrese un correo-e válido

Por favor, ingrese su mensaje

luauf.com 2012

WordPress