InicioCiencia Educacion(C++) system ("clear") y ("cls") portable + yapa

(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<<endl; que "limpiaba" la pantalla imprimiendo espacios vacíos.

La verdad que esto quedaba feo, por lo que seguí investigando y di con una función, de la librería <cstdlib> 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<<getenv( "OS" );

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!
Datos archivados del Taringa! original
45puntos
175visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
12visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

S
Usuario
Puntos0
Posts6
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.