de Conio.h a Ncurses.h en C – MS-DOS a GNU/Linux
By: Date: enero 14, 2008 Categories: Programación

El fin de semana pasado una amiga me pidió ayuda con su programa de fin de semestre, asi que me visito en mi oficina para ayudarla, el unico equipo disponible con compilador de C que tenia era una estación con GNU/Linux.

Desenfundo su memoria USB e inmediatamente trato de mostrarme el programa, por supuesto el .EXE precompilado que tenia, no funciono, asi que intento recompilar en Linux para hacer un ejecutable propio del sistema, pero no compilo.

Revise el código y el 90% era código ANSI, pero el manejo de la consola, no era así, no era portable porque conio.h es una librería de borland C y está prácticamente amarrada al MSDOS, jamás iba a funcionarle el código en Linux, a menos que se modificara y reescribiera una subversión para Linux y pues al final no es difícil portarlo, asi que la ayude con eso también, ahora tiene un programa que compila y funciona en DOS como en Linux

El problema que hay aun en algunas universidades es que siguen enseñando Turbo C y sus librerías privativas como la conio.h y no se les puede culpar de todo, al final de cuentas el manejo de la consola es diferente en cada plataforma, asi que cada plataforma tiene que tener sus propias librerías.

Para el viejo MSDOS, esta el conio y eso estaba bien cuando DOS reinaba, en los tipos de unix como Linux curses no es un estandart por la ANSI sin embargo es un standart defacto en cada unix.

Aquí tratare de mostrar como portar programas de conio.h a ncurses.h

Curses es mucho mas rico que conio, por ejemplo curses soporta underline osea subrayar letras en la consola ademas del clásico blink que las letras aparezcan y desaparezcan. El conio.h solo trae soporte a blink

Curses es solo un poco mas difícil de manipular que conio.h esto se debe a que se puede considerar a curses como una capa sobre la terminal, denominada ventana y sobre esta ventana se llevan a cabo los colores y efectos de la terminal, esta ventana debe ser inicializada, al mismo tiempo que es un buffer y debe ser tratado como tal.

Podemos inicializar la ventana con las siguientes funciones

initscr();
savetty();

y terminar la ventana para volver a la consola stadart con

echo ();
resetty();
endwin();

En realidad solo con resetty y endwin es suficiente, pero usamos echo para asegurarnos que quedara activado el echo, de lo contrario no se verán los caracteres porque no tendrán echo, si es que en el programa hicimos un noecho();

Despues deinicializar la ventana con curses.h la programación se torna similar a conio.h pero con algunas variantes, mostrare las fuciones mas comunes en conio.h en su versión curses

Conio.h ncurses.h

Limpiar pantalla
Clrscr(); – erase ();

Mover el cursor en la plantalla
Gotoxy (x,y) – move (y,x);
Nótese que las X y las Y están invertidas en curses, fuera de ese detalle el comportamiento es el mismo

Imprimir caracteres en pantalla
Cprintf (); – addch (); o si se trata de una cadena addstr ();

El manejo de color en curses es un poco mas complicado por que hay que verificar si la consola soporta color e inicializar el color, así como la paleta de colores que vamos a usar, la usaremos en pares 2 colores por vez ósea el color de frente y el de fondo
En conio.h textcolor y textbackground son 2 funciones separadas en curses se usan al mismo tiempo

Primero se inicializa con la función start_color ();
Después se asignan los colores con las funciones
init_pair (1,COLOR_CYAN,COLOR_BLACK);

en init_pair le decimos el color de frente que es CYAN y el de fondo que es negro
attron (COLOR_PAIR (1) | A_UNDERLINE);
con attron lo asignamos a la ventana, y además si queremos agregamos | A_UNDERLINE para que las letras esten subrayadas o usar A_BLINK para hacer que aparezcan y desaparezcan entre otras opciones como A_BOLD para hacerlas negritas, como dije curses es mas rico en elementos visuales para la consola.

Ahora escribiré un programa con estas funciones básicas que será exactamente igual a la hora de ejecutarse en DOS usando conio.h y en GNU/Linux usando curses.

Version DOS y Conio.h

#include <conio.h>
#include <stdio.h>

int cuadro (int a,int b,int c,int d)
{
    int x;

    for (x = a; x != c; x++)
    {
        gotoxy (x,b);
        putchar (205);
    }

    for (x = b; x != d; x++)
    {
        gotoxy (c,x);
        putchar (186);
    }

    for (x = c; x != a; x–)
    {
        gotoxy (x,d);
        putchar(205);
    }

    for (x = d; x != b; x–)
    {
        gotoxy (a,x);
        putchar(186);
    }

    gotoxy (a,b); putchar(201);
    gotoxy (c,b); putchar(187);
    gotoxy (c,d); putchar(188);
    gotoxy (a,d); putchar(200);
    return 0;
}

int main ()
{
    clrscr ();
    cuadro (5,5,70,20);
    cuadro (6,7,69,19);

    gotoxy (15,6);
    textcolor (CYAN);
    cprintf (“Hola MS/DOS, visita
https://www.lastdragon.net”);
    getchar ();

    return 0;
}

Version GNU/Linux y ncurses.h
#include <ncurses.h>

int cuadro (int a,int b,int c,int d)
{
        int x;

        for (x = a; x != c; x++)
        {
               
move (b,x);
               
addch(‘-‘);
        }

        for (x = b; x != d; x++)
        {
               
move (x,c);
               
addch(‘|’);
        }

        for (x = c; x != a; x–)
        {
               
move (d,x);
               
addch(‘-‘);
        }

        for (x = d; x != b; x–)
        {
               
move (x,a);
               
addch(‘|’);
        }

        move (b,a); addch(‘+’);
        move (b,c); addch(‘+’);
        move (d,c); addch(‘+’);
        move (d,a); addch(‘+’);
        return 0;
}

int main ()
{
        initscr();
        savetty();
        erase ();

        cuadro (5,5,70,20);
        cuadro (6,7,69,19);

        start_color ();
        init_pair
(1,COLOR_CYAN,COLOR_BLACK);
        attron (COLOR_PAIR (1) |
A_UNDERLINE);

        move (6,15);
        addstr (“Hola GNU/Linux,
visita https://www.lastdragon.net”);
        refresh ();

        getch ();
        echo ();
        resetty();
        endwin();

        return 0;

Video demostrando como corren ambos programas

Espero que este artículo ayude a todos los que aprendieron C en ambientes de Microsoft y DOS a migrar sus programas a GNU/Linux y otros NIX usando curses

14 thoughts on “de Conio.h a Ncurses.h en C – MS-DOS a GNU/Linux

  1. Internet Explorer 7.0 Windows Vista

    Los programas de consolas son muy eficientes , los programas serios están hechos en consola, como el apache por ejemplo, sendmail y otros.

    La consola es mucho más poderosa que un entorno grafico, el cual es limitativo y comedor de recursos, no con eso quiero que la gente use consola, solo que los desarrollos interesantes son en en consola, en el caso de los tipo de unix el programa real es de consola y el frontend es grafico por ejemplo al grabar un cd un programa grafico llama al cdrecord de consola, el grafico solo la hace de frontend, los frontend de firewall por abajo llaman a iptables.

  2. Mozilla Firefox 2.0.0.11 Windows XP

    Que tal David; Mi pregunta no tiene nada que ver con el post, de lo ultimo que recuerdo es que decias que habias migrado a un hosting en Mexico, las razones hasta donde recuerdo eran que eres mexicano (algo asi) y que aunque el servicio es mas lento y caro, pues ni modo. Mi pregunta es la siguiente, despues de entrar en repetidas ocasiones a tu blog, me doy cuenta que esta lentisimo y es pesadisimo navegar dentro de el, sin ser malinchista ni nada por el estilo, pero no crees que es un poco fuera de lo comun pagar mas por un servicio peor, solo por ser “patriota”. Claro tu eres libre se hacer lo que quieras, saludos y no lo tomes a agresion, solo es una inquietud.

  3. Epiphany 2.20 Linux

    Te pasas 🙁 tenía pendiente un artículo sobre exactamente el mismo tema xD (pasar de conio.h a ncurses.h)…

    Aunque realmente aún tengo en mente hacerlo 🙂 .

    Saludos Last.

  4. Mozilla Firefox 2.0.0.17 Ubuntu Linux

    Buenísima nota, justo estaba buscando como usar ncurses. Muchísimas gracias, ya postee el link en mi foro para que otras personas puedan verlo.

  5. Mozilla Firefox 3.0.6 Windows XP

    Me parece muy bueno el post, solo que seria muy bueno implementarlo con que tantas funciones tiene el ncurses.h, y asi como migrar codigo de DOs a UNIX, bueno mirar las librerias mas importantes y que tantas funciones tienen, si tienes un manual o un libro seria muy bueno que lo compartas. Yo probe el codeblock en windows y no funcionaba el clrscr() ni el gotoxy y descarge una libreria llamada conio.h y ya sirvio pues lo voy a probar en linux haber que pasa aunque hay que aprender de una ves por todas no usar mas el conio.h y migrar a ncurses.h. “Morir de una manera diferente es morir siendo libre” Kraken.

  6. Konqueror 4.3 Linux

    Hola, estuve mirando este post, y a mi no me andaa el “move”, si cambio el gotoxy por movee me sale esto: expected identifier or ‘(’ before ‘)’ token, no se si es por el move por el ncurses, ya tng unn quilombo en la cabeza!, me voy a ir a win y usar el borland y se van todos a la re mierd.. jjaja toy podrido con esto del conio

  7. Google Chrome 15.0.874.106 Ubuntu Linux

    Disculpa soy nuevo en el blog y en linux mi pregunta es no existen funciones como en graphics de borlan para dibujar cuadros???? o cosas asi todo tiene que ser dibujado por simbolos???? saludos desde mexico ^^

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *