(C++) system ("clear") y ("cls") portable + yapa
Buenas gente, espero que anden bien.
Antes que nada quiero aclarar, no descubri la existecia de vida en Marte. Es solo un pequeño post, para programadores que por ahi no estan muy metidos, o estudiantes como yo, que aprenden mas de prueba y error e investigacion, que de los propios estudios.
Hace un tiempo empecé a usar Ubuntu, y me di cuenta lo buen S.O. que es.
Me empecé a plantear ciertos interrogantes, y principalmente sobre la portabilidad de los programas que estamos haciendo.
Sobre todo con las funciones system( "cls" ) para Windows y system( "clear" ) para Linux.
Realmente estaba programando en Vim, y no tenía ganas de cambiar la función clear cada vez que iba al Lab a programar, entonces empecé a investigar (De esto, hace un par de meses).
Y llegue a varias respuestas, por ejemplo, hacer un for imprimiendo cout<
La verdad que esto quedaba feo, por lo que seguí investigando y di con una función, de la librería que se llama getenv.
Su prototipo es el siguiente:
char* getenv ( const char* name );
Basicamente le pasamos una cadena de texto (Una variable de entorno) y devuelve otra. Parece que mucho no sirve, pero investigando un poco, llegue a esto:
getenv( "OS" );
Así, esta funcion me retorna el nombre del sistema operativo, pero solo en el caso de Windows. Ejecutando en Windows 7 64 Bits algo así como:
cout<
Saca por pantalla esto:
Windows_NT
Este ( "OS" ), es una variable de entorno del sistema operativo, únicamente de Windows, por lo que se. La particularidad de la funcion, es que si le paso una variable de entorno “incorrecta”, me devuelve un puntero NULL (El mismo tipo de dato cuando tenemos problemas para abrir archivos con fopen("",""; )...).
Peeero, no sirve para Linux, ya que Linux no tiene (No conozco todas las versiones, pero Ubuntu no) una variable de entorno llamada "OS".
Entonces me dije, bueno, no me sirve para identificar el sistema operativo, pero si para decantarme por si es Windows, o Linux. ¿Cómo? con lo siguiente:
if( getenv( "OS" ) == NULL)
{
system( "clear" );
} else
{
system( "cls" );
}
Con esas 7 líneas de código, me pregunto si el puntero que me devuelve es NULL (Indicando que no se está ejecutando el programa sobre Windows), y en ese caso hago un clear al estilo Linux. En el else, simplemente hago un clear al estilo Windows.
Como ya dije, no me sirve para identificar un MacOS de un BerOS, pero aumento la portabilidad muchísimo, sabiendo en cuál de los 2 sistemas operativos líderes se está ejecutando el programa compilado.
Y de yapa, les dejo la funcion que hice, que no es gran cosa, para reemplazar el system( "pause" ), por algo más portable:
cout<<"Presione cualquier tecla para continuar...";
cin.ignore();
cin.get();
Las 2 funciones están probadas en Windows 7 64 bits y en Ubuntu, tanto en tiempo de compilación como de ejecución, y no dan ningún problema aparente.
Nada más que eso.
Si llegaron leyendo hasta acá, es porque de verdad les interesa.
Son libres de usarlas cuantas veces y donde quieran.
Me llevo mucho tiempo investigar sobre esto, así que si las usan, solo les pido un "Gracias", no cuesta nada.
Saludos gente! Suerte!
Antes que nada quiero aclarar, no descubri la existecia de vida en Marte. Es solo un pequeño post, para programadores que por ahi no estan muy metidos, o estudiantes como yo, que aprenden mas de prueba y error e investigacion, que de los propios estudios.
Hace un tiempo empecé a usar Ubuntu, y me di cuenta lo buen S.O. que es.
Me empecé a plantear ciertos interrogantes, y principalmente sobre la portabilidad de los programas que estamos haciendo.
Sobre todo con las funciones system( "cls" ) para Windows y system( "clear" ) para Linux.
Realmente estaba programando en Vim, y no tenía ganas de cambiar la función clear cada vez que iba al Lab a programar, entonces empecé a investigar (De esto, hace un par de meses).
Y llegue a varias respuestas, por ejemplo, hacer un for imprimiendo cout<
La verdad que esto quedaba feo, por lo que seguí investigando y di con una función, de la librería
Su prototipo es el siguiente:
char* getenv ( const char* name );
Basicamente le pasamos una cadena de texto (Una variable de entorno) y devuelve otra. Parece que mucho no sirve, pero investigando un poco, llegue a esto:
getenv( "OS" );
Así, esta funcion me retorna el nombre del sistema operativo, pero solo en el caso de Windows. Ejecutando en Windows 7 64 Bits algo así como:
cout<
Saca por pantalla esto:
Windows_NT
Este ( "OS" ), es una variable de entorno del sistema operativo, únicamente de Windows, por lo que se. La particularidad de la funcion, es que si le paso una variable de entorno “incorrecta”, me devuelve un puntero NULL (El mismo tipo de dato cuando tenemos problemas para abrir archivos con fopen("",""; )...).
Peeero, no sirve para Linux, ya que Linux no tiene (No conozco todas las versiones, pero Ubuntu no) una variable de entorno llamada "OS".
Entonces me dije, bueno, no me sirve para identificar el sistema operativo, pero si para decantarme por si es Windows, o Linux. ¿Cómo? con lo siguiente:
if( getenv( "OS" ) == NULL)
{
system( "clear" );
} else
{
system( "cls" );
}
Con esas 7 líneas de código, me pregunto si el puntero que me devuelve es NULL (Indicando que no se está ejecutando el programa sobre Windows), y en ese caso hago un clear al estilo Linux. En el else, simplemente hago un clear al estilo Windows.
Como ya dije, no me sirve para identificar un MacOS de un BerOS, pero aumento la portabilidad muchísimo, sabiendo en cuál de los 2 sistemas operativos líderes se está ejecutando el programa compilado.
Y de yapa, les dejo la funcion que hice, que no es gran cosa, para reemplazar el system( "pause" ), por algo más portable:
cout<<"Presione cualquier tecla para continuar...";
cin.ignore();
cin.get();
Las 2 funciones están probadas en Windows 7 64 bits y en Ubuntu, tanto en tiempo de compilación como de ejecución, y no dan ningún problema aparente.
Nada más que eso.
Si llegaron leyendo hasta acá, es porque de verdad les interesa.
Son libres de usarlas cuantas veces y donde quieran.
Me llevo mucho tiempo investigar sobre esto, así que si las usan, solo les pido un "Gracias", no cuesta nada.
Saludos gente! Suerte!
0No comments yet
