• Blog
  • Acerca
  • Autor
  • Contacto
  • Cómo dejar de usar conio.h

    La librería <conio.h>, es propiedad de Borland y sólo sus compiladores pueden usarla. Por lo tanto significa que conio.h, no es una librería estandar.

    La librería conio se utiliza más que nada por sus comandos: getch(), clrscr(), gotoxy(), textcolor(), y textbackground(), los cuales usamos para darle mejor presentación a nuestros programas. Pero pensandolo bien, ¿en verdad necesitamos que los programas en consola se vean bien? La verdad es que no, lo que importa es que funcionen.

    Aún así, algunas funciones de la librería conio.h se pueden sustituir con funciones estándares, por ejemplo.

    • Para sustituir getch(), solo necesitamos: cin.get(); la cual está en <stdio.h>. Si no funciona entonces tendremos que ponerla dos veces: cin.get();cin.get();, la cuestión es algo complicada de explicar.
    • Para sustituir clrscr(), solo necesitamos escribir system(“cls”); la cual está en <iostream> (es sin .h, se definiría así: #include<iostream>).
    • Gotoxy() es algo vanal, y además se puede sustituir usando \n (espacio hacia abajo) y \t (espacio hacia la derecha) dentro de un printf();
    • Y la verdad es que cualquiera te agradecerá que no le pongas fondo rosa y letras amarillas a tus programas.
    1. lin_mdotor dice:

      Acabo de encontrar este blog, y la verdad es que lo poco que he visto hasta ahora me ha parecido muy interesante, ya que hace poco que he empezado a estudiar programación en C y tiene buenos ejemplos.

      Estoy haciendo un programa en el que un asterisco se mueve en la terminal de comandos rebotando de lado a lado, tomando algunas variables como su posición y velocidad.
      A mi entender, para ello es imprencindible el gotoxy(), así que quería preguntarte si sabes alguna forma de sustituir el gotoxy() por otra función parecida que no sea exclusiva de Borland. Ya que creo que simplemente con el \n y \t del printf no se puede.

      Gracias y un saludo.

    2. JoseTN dice:

      Yo no sé casi nada de C,
      pero hace muchos años cuando se quería
      mover el cursor en una pantalla de texto
      había unos caracteres ASCII/ANSI que movian el cursor en las cuatro direcciones, creo que eran los códigos ESC escape más lo que sea,
      como se usa con las impresoras matriciales,

      http://ascii-table.com/ansi-escape-sequences-vt-100.php

      Es para terminal VT100, no sé si sirve para consola a secas.

    3. Ruben dice:

      Excelente, llevo dos dias con un problema y ya lo resolvi gracias a esto, no me funcionaba el cin.get(); pero ahora se que lo debo de poner dos veces.

      Gracias

    4. Alfonso dice:

      Hola, primero decir que me gusta mucho la idea de no utilizar conio.h, gracias por animarnos.

      Ahora tengo una pregunta, no me funciona cin.get() ni una ni dos veces…

      No debería de funcionar:
      #include

      int main()
      {
      char c;
      c=cin.get();
      printf(“La letra pulsada es %c\n”,c);
      return 0;
      }

      Muchas gracias!!

    5. Alfonso dice:

      Hola de nuevo, dos cosas:

      en el trozo de código faltaría stdio.h pero no aparece.

      te pido perdón porque no me he dado cuenta que hablabas de C++, yo programa en C, se te ocurre algo?

      Muchas gracias!

    6. Ésta función hace lo mismo que el gotoxy

      //funcion gotoxy
      void gotoxy(int x,int y)
      {
      printf(“%c[%d;%df”,0x1B,y,x);
      }

    7. La verdad es que ejecutar system(“cls”); no es demasiado rápido y encima vale sólo para sistemas Windows. Como dice JoseTN sería mejor usar códigos ANSI. Por otra parte, no podemos sustituir gotoxy por \n y \t como bien dice lin_mdotor.

      Puedes probar algo como: http://totaki.com/poesiabinaria/2009/05/colores-y-posicionamiento-en-terminales-linux-como-conioh-en-dos/ a ver si te funciona.

    8. Manuel dice:

      Alfonso para usar la funcion “cin” en cualquiera de sus variantes tienes que usar la libreria “iostream.h” ya que esta funcion pertenece a esta y no a “stdio.h” igualmente si usas “cout”

      Tu codigo quedaria asi:

      #include

      int main(){
      char c;
      c=cin.get();
      printf(“La letra pulsada es %c\n”,c);
      return 0;
      }

      • Alfonso dice:

        Hola Manuel,
        Gracias por tu respuesta, pero no me ha funcionado.
        No encuentra iostream ni iostream.h . Por lo que no me reconoce cin.get().
        Como supongo que tendrá que ver con estas dos cosas repito que utilizo C y no C++ y Linux como SO.
        Un saludo

    9. A veces, es necesario el uso de gotoxy, en caso de pequeños UI en texto, y llamar a system para borrar la pantalla es muy lento.

      Propongo utilizaar para tareas de pantalla, códigos ANSI. Podemos encontrar librerías como conio for linux o stermp (http://totaki.com/poesiabinaria/?s=conio) que usan código ANSI entre otras cosas. También tenemos ncurses, pero esta es más avanzada.

    10. Un comentario esta dos veces de forma pareecida, creia que el otro día no había entrado… lo siento

    11. Jesus dice:

      Primero que todo gracias por tus ejemplos, por otro lado quiero saber si conoces alguna forma de mostrar las lines de textos en diferentes colores (mi profesor de programación me lo dejó de tarea).

    12. Julio Cesar dice:

      si se trata solo d mover el cursor a alguna posicion tal veste esto les sirva no es exactamente eso solo cuestion de modificar algunas cosas sencillas con este codigo mueves el cursor a donde desees con las teclas direcioneles use conio pero solo por el getch() igual no es la version completa use el copilador dev.
      #include
      #include

      using namespace std;

      int main()
      {
      int tecla;
      int i=0;
      int k=0;
      int c=176;//valor del caracter a imprimir o cursor
      int p=32;//valor asch para espacio

      cout<<char(c);

      do
      {
      getch();

      system("cls");

      tecla=getch();

      if(tecla==77)//mov del cursor a la derecha
      {
      i=i+1;
      }
      if(tecla==75)//mov del cursor a la izquierda
      {
      i=i-1;

      if(i<0)
      {
      i=0;
      }
      }
      if(tecla==80)//mov del cursor abajo
      {
      k=k+1;
      }
      if(tecla==72)//mov del cursor arriba
      {
      k=k-1;

      if(k<0)
      {
      k=0;
      }

      }

      for(int j=0;j<k;j++)//mueve cursor verticalmente
      {
      cout<<"\n";
      }
      for(int j=0;j<i;j++)//mueve el cursor horizontalmente
      {
      cout<<char(p);
      }
      cout<<char(c);

      }while(tecla!=27);//sale del sistema si se preciona esc

      return 0;

      }

    13. ale dice:

      ps yo no se mucho de lenguaje c pero necesito gotoxy no para crear un programa bonito, sino para crear un caracol de numeros y no encuentro un equivalente para gotoxy o una libreria a el

    14. atzx dice:

      Bueno aca les coloca un code, esta hecho en asm y compilado en Turbo C++ 3.0, lo hice para evitar la funcion gotoxy(); y asi evitar la libreria conio.h q no es estandar… Ojala les sierva

      Código:
      #if !defined(__gtxy_h)

      #define __gtxy_h

      #include

      /*****************************************

      * Me imprime una cadena en la posion 0,0 *
      * ————————————– *
      * simula un printf(); *

      ******************************************/

      void imprime(unsigned char *cadena)

      {

      strcat(cadena,”$”); // une la cadena enviada con el simbolo $ para

      asm mov dx,cadena // que DX pueda determinar fin de cadena

      asm mov ah,0×9

      asm int 0×21

      }

      /****************************************

      * Ubica el cursor en la posicion x,y *
      * ————————————- *
      * esta es una funcion para evitar la *
      * famosa libreria conio para el comando *
      * gotoxy(); *

      *****************************************/

      void irxy(unsigned char x, unsigned char y)

      {

      asm mov dh,x // filas

      asm mov dl,y // columnas

      asm mov bh,0×00 // numero de paginas

      asm mov ah,0×02

      asm int 0×10

      }

      # endif

      Ejemplo de su funcionamiento:

      hay dos formas de escribir en pantalla una es utilizar la libreria stdio para el prinft() y la otra es solo colocar la librerira arriba expuesta…

      1º FORMA

      #include
      #include
      #include “gtxy_h ”

      void main()
      {
      system(“cls”);
      irxy(10,20);
      printf(“Hola gente”);
      system(“pause”);
      }

      2º FORMA

      #include
      #include “gtxy_h”

      void main()
      {
      system(“cls”);
      irxy(10,20);
      imprime(“Hola gente”);
      system(“pause”);
      }

      Y como vemos nos evitamos la molestosa libreria conio.h…

      PD: Me gustaria acabar esta libreria, si alguien se uniera bienvenido….

      http://foro.elhacker.net/programacion_cc/una_libreria_para_reemplazar_para_de_conio_con_su_comando_gotoxy-t87812.0.html#ixzz1fAbcKaT6

    15. atzx dice:

      ACA EL CODIGO DE NUEVO NO SE VEN LA LIBRERAS;

      #if !defined(__gtxy_h)

      #define __gtxy_h

      #include “string.h”

      /*****************************************

      * Me imprime una cadena en la posion 0,0 *
      * ————————————– *
      * simula un printf(); *

      ******************************************/

      void imprime(unsigned char *cadena)

      {

      strcat(cadena,”$”); // une la cadena enviada con el simbolo $ para

      asm mov dx,cadena // que DX pueda determinar fin de cadena

      asm mov ah,0×9

      asm int 0×21

      }

      /****************************************

      * Ubica el cursor en la posicion x,y *
      * ————————————- *
      * esta es una funcion para evitar la *
      * famosa libreria conio para el comando *
      * gotoxy(); *

      *****************************************/

      void irxy(unsigned char x, unsigned char y)

      {

      asm mov dh,x // filas

      asm mov dl,y // columnas

      asm mov bh,0×00 // numero de paginas

      asm mov ah,0×02

      asm int 0×10

      }

      # endif

      Ejemplo de su funcionamiento:

      hay dos formas de escribir en pantalla una es utilizar la libreria stdio para el prinft() y la otra es solo colocar la librerira arriba expuesta…

      1º FORMA

      #include “stdio.h”
      #include “stdlib.h”
      #include “gtxy_h”

      void main()
      {
      system(“cls”);
      irxy(10,20);
      printf(“Hola gente”);
      system(“pause”);
      }

      2º FORMA

      #include “stdlib.h”
      #include “gtxy_h”

      void main()
      {
      system(“cls”);
      irxy(10,20);
      imprime(“Hola gente”);
      system(“pause”);
      }

      http://foro.elhacker.net/programacion_cc/una_libreria_para_reemplazar_para_de_conio_con_su_comando_gotoxy-t87812.0.html#ixzz1fAgF2wKk

    16. deltagamma2000 dice:

      /*Funcion que Emula GETCH() de la libreria BorlandC. Utiliza la libreria windows.h*/
      int getch(void)
      {
      int car;
      DWORD leidos, modo;

      GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &modo);
      SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), modo & !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT);
      ReadConsole(GetStdHandle(STD_INPUT_HANDLE), &car, 1, &leidos, NULL);
      SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), modo);
      return car;
      }

    17. Victor Macías dice:

      Nosotros escribimos algunas funciones! Con windows.h

      int gotoxy(short x, short y){ //Donde x es columna, y es fila;
      COORD coord;
      HANDLE h_stdout;

      coord.X = x;
      coord.Y = y;

      if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
      return 0;

      if (SetConsoleCursorPosition(h_stdout, coord) == 0)
      return 0;

      return 1;
      }

      void textcolor(int color){
      SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);

      return;
      }

      Y de esta si me jacto autoría, aunque tal vez a alguien más ya se le haya ocurrido…

      void clrscr(void){
      int i;
      COORD coord;

      typedef struct{
      COORD dwSize;
      COORD dwCursorPosition;
      WORD wAttributes;
      SMALL_RECT srWindow;
      COORD dwMaximumWindowSize;
      } INFO;

      INFO info;
      GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
      coord = info.dwCursorPosition;

      coord.X = 0;
      for (i = coord.Y; i>=0; i–){
      coord.Y=i;
      SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
      for (i=0; i<80; i++){
      printf(" ");
      // Sleep(1);
      }
      i = coord.Y;
      }

      coord.X=0;
      SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

      return;
      }

      Con ese Sleep se puede lograr efectos nice de que se borra lento… xD

      Suerte codificando!

    18. Homonymus dice:

      con lo del clrscr(). yo lo uso por que mis programas se usan tanto en linux como en windows. y si uso system(“cls”) no va a andar en linux, y si usp system(“clear”) no va a andar en windows :/

    19. s8k! dice:

      Hola, entre las librerias estándar de C, un equivalente de getch() es getchar() de , a diferencia que getchar necesita un enter para tomar el caracter, y con la system(char *cmd) de se puede usar como dice el escritor del blog. La única referencia de gotoxy y clrscr que he visto en linux es en free pascal que si las tiene, les dejo la referencia oficial http://community.freepascal.org:10000/docs-html/rtl/crt/gotoxy

    20. s8k! dice:

      Borraron los tags menor y mayor. Las librerias son “stdio.h” para getchar() y “stdlib.h” para system(char *cmd).

    21. erick rashon dice:

      saludos pueden usar gotoxy sin escribir conio.h solo escriben una funcion con el siguiente codigo:
      void gotoxy(int x,int y){
      HANDLE hCon;
      COORD dwPos;
      dwPos.X = x;
      dwPos.Y = y;
      hCon = GetStdHandle(STD_OUTPUT_HANDLE);
      SetConsoleCursorPosition(hCon,dwPos);
      }

    22. Anonimo dice:

      Para sustituir getch(), solo necesitamos: cin.get(); la cual está en . Si no funciona entonces tendremos que ponerla dos veces: cin.get();cin.get();, la cuestión es algo complicada de explicar.

      alli hubo un gran error, cin.get no es de stdio, es de iostream ;) chequen bien las cosas que publican.
      otro gran error, la forma correcta de importar las librerias de C es con #include, el .h es de C, no de C++,

    23. DANIEL dice:

      En lo personal uno se quita de problemas usando ensamblador. Es más fácil y menos tedioso C/ASM!

    24. christian dice:

      yo si necesito esos fondos rosas y letras amarillas -.-!, bueno, es por que creo un juego de ajedrez y veria mas desente identificar las fichas con sus colores (entre otro juegos), aun no se si puedo crear figuras… por lo poco que se el juego lo tube que hacer con letras minusculas y mayusculas para diferenciar las negras de las blancas, pero no era lo que tenia pensado :/, y si conio.h no es standar.. que no hay otra forma de darles color? D:

    1. [...] usando gotoxy sería mas fácil, pero este blog promueve el no uso de la librería conio.h (Cómo dejar de usar conio.h) así que lo vamos a hacer como les dije. #include<iostream> #include<string.h> using [...]

    Hola, escribe aquí tu comentario: