2012-06-30 18 views
5

descargaba un compilador (creo que fue MinGW pero no estoy seguro) en Windows 2000 el otro día (generalmente soy un usuario de Mac, pero no era' t mi máquina), y el programa de descarga era una aplicación de línea de comandos de MS-DOS que mostraría una barra de progreso para la descarga. Algo como esto ...Cómo borrar los caracteres impresos desde la línea de comandos en C++

|---     | 15% 
... 
|------    | 30% 
... 
... 
|--------------  | 70% 

excepto que se actualizará continuamente en la misma línea. Supongo que el programa logró esto al eliminar los caracteres impresos anteriormente y volver a imprimir los diferentes, pero parece que no puedo encontrar la manera de hacerlo.

He tratado de imprimir un carácter 'borrado' de varias maneras diferentes, como (char)8 y \b (incluso \r, que oí preclasificación al principio de la línea en algunos idiomas), pero ninguna de esas cosas trabajado.

¿Alguien sabe cómo hacer este tipo de cosas?

Editar: Esta pregunta se ha convertido en específico de la plataforma. Quiero saber específicamente cómo lograr esto en una Mac.

+0

Would 'clrscr' do it? –

+1

relacionados: http://stackoverflow.com/questions/60221/how-to-animate-the-command-line?rq=1 – Pubby

+0

clrscr despejaría toda la pantalla, y en el mac lo único que hace es imprimir suficientes saltos de línea a mueve todo fuera de la pantalla (lo que significa que aún puedes desplazarte hacia atrás, lo cual es útil, pero también molesto). – anthropomorphic

Respuesta

2

Según to Wikipedia:

La consola Win32 no es compatible con secuencias de escape ANSI en absoluto. El software puede manipular la consola con la API de consola ioctl entrelazada con la salida de texto. Algún software interpreta internamente las secuencias de escape de ANSI en el texto que se está imprimiendo y las traduce a estas llamadas [cita requerida].

Salida esto: http://msdn.microsoft.com/en-us/library/ms682073.aspx

creo SetConsoleCursorPosition es lo que le permite reemplazar texto.

4

No estoy seguro de por qué tuvo problemas, pero ya sea \b or \r se puede utilizar para hacer esto, he usado \b.

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <windows.h> 

// This is the only non-portable part of this code. 
// Simply pause for a specified number of milliseconds 
// For Windows, we just call Sleep. For Linux, you'd 
// probably call nanosleep instead (with a suitable 
// multiplier, of course). Most other systems (presumably) 
// have (at least vaguely) similar capabilities. 
void pause(int ms) { 
    Sleep(ms); 
} 

static const int width = 40;  

void show_percent(int i) { 
    int dashes = (width * i)/100; 

    std::cout << '|' << std::left << std::setw(width) << std::string(dashes, '-') << '|' << std::setw(3) << i << "%"; 
} 

int main() { 

    for (int i=0; i<101; i++) { 
     show_percent(i); 
     std::cout << std::string(width+6, '\b'); 
     pause(100); 
    } 
} 
+0

Creo que la manera portátil para hacer que en C++ 11 sería 'std :: :: this_thread sleep_for (std :: :: crono milisegundos (ms));' Mi – anthropomorphic

+0

malo, espaciados. Estaba tan impresionado con tu código de show_percent que me olvidé de mencionar que la cosa '\ r' no funcionó en absoluto. Creo que puede tener que ver con la diferencia en la forma en que Windows, Mac OS X y Linux representan líneas nuevas. – anthropomorphic

+0

@MichaelDorst: Sí, no había pensado en eso hasta que lo mencionaste, pero en la Mac, durante años han usado '\ r' como el carácter de 'nueva línea', por lo que probablemente no sea sorprendente que no lo haga Simplemente regrese al comienzo de la línea actual como lo haría en un sistema sensato. No tengo una Mac para probar, pero veo si el código modificado anterior funciona mejor. –

Cuestiones relacionadas