Direi che una libreria come ncurses sarebbe usata per queste cose. curses aiuta a spostare il cursore sullo schermo e disegnare testo e simili.
NCurses
Qualcosa del genere:
std::stringstream out;
for (int i = 0; i< 10; i++)
{
out << "X";
cout << "\r" << "[" << out.str() << "]";
}
La parte subdola è il carattere di ritorno a capo "\r" che fa spostare il cursore all'inizio della riga senza passare alla riga successiva.
Altri hanno già sottolineato che puoi usare \r
per tornare all'inizio della riga corrente e sovrascrivere l'intera riga.
Un'altra possibilità è usare il carattere backspace ("\b") per cancellare alcuni spazi e sovrascrivere solo quegli spazi. Questo può avere un paio di vantaggi. Innanzitutto, evita ovviamente di dover rigenerare tutto nella linea, il che a volte può essere leggermente doloroso (anche se è abbastanza insolito). In secondo luogo, può evitare un po' di problemi nel visualizzare dati che (per esempio) si riducono di dimensione mentre li scrivi -- per esempio, se stai visualizzando un conto alla rovescia da 100 a 0, con \r
devi stare attento a non sovrascrivere l'intera lunghezza precedente, altrimenti il conto alla rovescia passerà da (ad esempio) 100 a 990 (ovvero, lasciando intatto lo "0" precedente).
Si noti, tuttavia, che mentre il backspace all'interno di una riga funziona normalmente, un backspace all'inizio di una riga può o meno spostare il cursore/la posizione di scrittura indietro su una riga precedente. Per scopi più pratici, puoi spostarti solo all'interno di una singola riga.
prova a usare \r
invece di \n
durante la stampa della nuova "versione".
for(int i=0;i<=100;++i) printf("\r[%3d%%]",i);
printf("\n");