2009-09-02 34 views
5

Mis disculpas por un título inexacto, pero no estoy seguro de cómo se llama exactamente.Imprimir en consola sin inundar en C++

¿Cómo se imprimirá en la consola una sola línea de actualización?

Por ejemplo, si quisiera imprimir un estado de porcentaje de finalización de cada ciclo pero no inundar la consola con vapores de texto, ¿cómo lo lograría? (¿Cómo se llama esto? - para buscar en Google en el futuro)

¡Gracias!

Respuesta

11

No hay manera portátil para limpiar la pantalla, aunque hay una forma sencilla de volver al principio de la líneausando \r continuación sobrescribir lo que escribimos antes. Estoy usando Sleep de Windows API:

#include <iostream> 
#include <windows.h> 
using namespace std; 

int main() 
{ 
for(int i = 1; i <= 10; i++) 
{ 
    std::cout << i*10 << '%'; 
    std::cout.flush(); // see wintermute's comment 
    Sleep(1000); 
    std::cout << '\r'; 
} 
} 
+0

Para una iluminación adicional, '\ r' genera un retorno de carro. –

+6

Es posible que desee llamar a 'std :: cout.flush()' antes de 'Sleep() 'ya que' std :: cout' es una transmisión en búfer y, por lo tanto, es posible que su contenido no se muestre cuando lo desee. –

+1

Como dice Dan, '\ r' es un retorno de carro, que no * borra * la línea, simplemente mueve el cursor al principio de la línea. –

2

La solución básica es:

loop: 
    backspace (over written text) 
    write (without newline) 
    flush 
    wait and get updates 

Alternativamente, usted podría intentar una solución utilizando la biblioteca maldiciones - aunque no estoy seguro de si esto es exactamente lo estás después. Curses proporciona los gráficos ascii básicos para las GUI basadas en texto (a veces denominadas TUI).

+0

Curses es la única forma de hacer este puerto hábilmente. Tenga en cuenta que asume que su consola es parte de la base de datos de curses. –

3

Curses es la única manera de hacerlo de forma portátil.

Tener un vistazo a esto: http://code.google.com/p/tinycurses/wiki/basic1

+2

No diría la "única" manera. Si el terminal es compatible con ANSI, puede generar "\ r" o "\ 015". Si es compatible con VT-100, también puede dar salida '\ 033 [5n' al TTY y la respuesta será a lo largo de '\ 033 [5; 5R' y luego podrá enviar '\ 033 [5; 0H 'ir al comienzo de la línea 5. Eso es todo lo que hace ncurses de todos modos. – greyfade

+0

La única forma ** portátil **. Porque las curas abstraen la terminal, por lo que no necesita saber si es compatible con VT-100 o cualquier otra cosa. Puedes hacer lo que describes en casi cualquier terminal, solo tienes que buscar en la documentación y entenderla. Es por eso que tenemos maldiciones ** ABSTRACTS ** la terminal por lo que no necesita saber, por lo tanto, es la única forma ** PORTABLE **. OK, hay otras bibliotecas (como ncurses). Sí, acabas de recordar que ncurses es solo maldiciones, pero una nueva versión :-) –

0

¿A qué velocidad son sus ciclos? Están en milisegundos o segundos. Si sus ciclos son cortos, es posible que solo desee actualizar la pantalla después de un segundo como elpasado.

Por ejemplo

include <time.h> /* if memory serves me correctly */ 
    int currentTime = time(0); 
    for (int i = 0; i < 100; i++) 
    { 
    /* do work here and save the percentage completed */ 
    lastTime = time(0); 
    if ((lastTime-currentTime) >= 1) 
    { 
     /* output percentage completed (using AraK information) */ 
     currentTime = lastTime; 
    } 
    } 

Esto sólo se actualizará la pantalla cada segundo y ahorrar el tiempo de escribir a la pantalla, ya que consume tiempo para volver a dibujar la pantalla (que se puede utilizar para el procesamiento). Además, si sus actualizaciones van tan rápido, esto le permite al usuario ver el porcentaje si sus ciclos son bastante cortos, ya que podría estar redibujando la pantalla todo el tiempo.

Nota: Actualizado en función de los comentarios.

+0

Tiene que ser hora (0). time() toma la dirección de un time_t, actualizando el time_t referenciado si se proporciona. –

+2

O simplemente puede actualizarlo cuando el porcentaje realmente aumenta, no tiene sentido actualizarlo si se va a mostrar lo mismo, y con el número de llamadas de sorteo que van más allá de 101 (suponiendo una visualización de 0% -> 100%) , el dibujo no va a tener mucho impacto en el rendimiento –

+0

Gracias por la entrada. Ha pasado un tiempo desde que utilicé la función de tiempo. – Glenn

0

Esto depende de la plataforma que esté utilizando. No estoy seguro de cómo hacer esto en Linux, pero en Windows puede usar WriteConsole o SetConsoleCursorPosition para hacer esto.

No creo que exista una forma completamente portátil de hacer esto que no sea la salida de una tonelada de espacios invertidos como ya se mencionó. El método de retroceso puede causar una gran cantidad de parpadeo que puede ser inaceptable en su aplicación ... las funciones de Win32 no causan parpadeo. No estoy seguro acerca de la biblioteca de curses.

Cuestiones relacionadas