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.
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.
Bueno gracias :D. Cuando hice este post busqué un sustituto fácil para gotoxy y la verdad no encontré.
Saludos también.
amigo… este codigo se usa para remplazar la funcion gotoxy de conio.h de borland… solo tienes que incluir la libreria windows.h … exitos!!
Oh gracias!, pero creo que se te olvidó poner el código XD
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.
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
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!!
la libreria esta incompleta amigo
Pudieras usar un fflush(stdin); antes del cin.get();
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!
Ésta función hace lo mismo que el gotoxy
//funcion gotoxy
void gotoxy(int x,int y)
{
printf(“%c[%d;%df”,0x1B,y,x);
}
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.
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;
}
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
No encuentra el iostream.h porque la librerÃa se llama iostream sin el “.h” al final.
Aunque aun no he conseguido hacer funcionar el cin.get()..
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.
Un comentario esta dos veces de forma pareecida, creia que el otro dÃa no habÃa entrado… lo siento
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).
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;
}
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
Más arriba pongo un link con una alternativa. En mi web también lo encuentras
Wow, tu web tiene códigos bastante interesantes ¡y muy bien explicados!
/*codigo funcion gotoxy*/
//solo es incluir windows.h y con esta
//funcion hace exactamente lo mismo que gotoxy de borland
#include
void gotoxy( int column, int line )
{
COORD coord;
coord.X = column;
coord.Y = line;
SetConsoleCursorPosition(GetStdHandle( STD_OUTPUT_HANDLE ),coord);
}
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
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
/*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;
}
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!
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 :/
ya encontre una posible solucion ^^
#ifdef WIN32
#define clrscr() system(“cls”);
#else
#define clrscr() system(“clear”);
#endif
Saludos!
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
Borraron los tags menor y mayor. Las librerias son “stdio.h” para getchar() y “stdlib.h” para system(char *cmd).
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);
}