Sé que esta es una publicación anterior, pero la aceptada no cubre los casos en que cout se canaliza a un programa o archivo y esta es la parte superior de mis búsquedas en Google. Lo siguiente manejará tanto stdout con y sin tubería con un comportamiento ligeramente diferente.
#include <iostream>
#include <functional>
#include <stdio.h>
#ifdef _WIN32
#include <io.h>
#else
#include <unistd.h>
#define _isatty isatty
#define _fileno fileno
#endif
const std::function<void(const size_t&)> progress_printer(_isatty(_fileno(stdout)) == 1 ?
[](const size_t& i) {
std::cout << "\rNumber " << i << std::flush;
} :
[](const size_t& i) {
static std::ios::off_type last(-1);
if(last != -1)
std::cout.seekp(last, std::ios::beg);
last = std::cout.tellp();
std::cout << "Number " << i << std::endl;
}
);
Esto no se ha probado en Windows, pero debería funcionar. Lo que hace es detectar si el descriptor de archivo o es un tty. Si es así, simplemente escribe '\ r' si la posición no ha cambiado desde la última vez que se imprimió o una nueva línea. Si no es una línea nueva, busca el último lugar después de que se imprimió.
Se comporta de manera diferente para los archivos que para tty. Para un archivo, si algo sale a la secuencia entre las impresiones, entonces puede sobrescribir parte o todo lo que se escribió incluso después de las nuevas líneas. Para ttys, simplemente sobrescribe los caracteres al principio de la línea actual.
No puedes. 'cout' no representa la consola. Representa una secuencia de salida. Eso significa que puede escribir en él, pero no puede hacer nada con respecto a lo que ya se ha escrito. 'cout' es para imprimir el resultado a cualquier dispositivo de salida que use la plataforma (por ejemplo, pero no necesariamente, una ventana de consola). Si necesita manipular la consola específicamente, debe usar una biblioteca específica del sistema operativo que conozca la ventana de la consola. – jalf
¿Por qué quieres borrar la lista de tareas completadas? Simplemente imprima un elemento de progreso de la tarea por línea, y se reproducirá mejor si alguien ejecuta su programa y canaliza stdout a un archivo de registro. – jamesdlin
Lo sé, pero habrá MUCHAS líneas, no quiero ahogar al usuario en infos, simplemente darle el estado y el porcentaje de progreso de cada tarea que obtuve. –