So che questo è un vecchio post, ma l'accettato non copre i casi in cui cout è convogliato su un programma o un file e questa è la parte superiore delle mie ricerche su google. Quanto segue gestirà sia lo stdout con pipe che quello non con un comportamento leggermente diverso.
#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;
}
);
Questo non è verificato su Windows, ma dovrebbe funzionare. Quello che fa è rilevare se il descrittore di file o è un tty. Se è così, scrive "\ r" se la posizione non è cambiata dall'ultima volta che è stata stampata o una nuova riga. Se non è una nuova riga, cerca l'ultimo posto in cui si trovava dopo la stampa.
Si comporta in modo diverso per i file rispetto a tty. Per un file, se qualcosa viene esportato nello stream tra le stampe, può sovrascrivere tutto o parte di ciò che è stato scritto anche dopo le nuove righe. Per le ttys sovrascrive i caratteri all'inizio della riga corrente.
Non è possibile. 'cout' non rappresenta la console. Rappresenta un flusso di output. Ciò significa che puoi scriverci sopra, ma non puoi fare nulla per ciò che è già stato scritto. 'cout' è per la stampa di output su qualsiasi dispositivo di output utilizzato dalla piattaforma (ad esempio, ma non necessariamente, una finestra di console). Se è necessario manipolare la console in modo specifico, è necessario utilizzare una libreria specifica del sistema operativo che conosca la finestra della console. – jalf
Perché vuoi cancellare anche l'elenco delle attività completate? Basta stampare un elemento di progresso dell'attività per riga, e andrà meglio se qualcuno esegue il programma e lo stdout delle pipe in un file di registro. – jamesdlin
Lo so, ma ci saranno MOLTE linee, non voglio affogare l'utente sotto le informazioni, basta dargli lo stato e il progresso percentuale di ogni attività che ho eseguito. –