Řekl bych, že knihovna jako ncurses by byla na takové věci zvyklá. curses pomáhá pohybovat kurzorem po obrazovce a kreslit text a podobně.
NCcurses
Něco takového:
std::stringstream out;
for (int i = 0; i< 10; i++)
{
out << "X";
cout << "\r" << "[" << out.str() << "]";
}
Záludný bit je znak návratu vozíku "\r", který způsobí, že se kurzor přesune na začátek řádku, aniž by přešel na další řádek.
Jiní již poukázali na to, že můžete použít \r
pro návrat na začátek aktuálního řádku a přepsání celého řádku.
Další možností je použít znak backspace ("\b") k vymazání několika mezer a přepsání pouze těchto mezer. To může mít několik výhod. Za prvé, zjevně se vyhne nutnosti regenerovat vše v řadě, což může být někdy mírně bolestivé (ačkoli to je poměrně neobvyklé). Za druhé, může se vyhnout bolesti při zobrazování dat, která se (například) při psaní zmenšují – například pokud zobrazujete odpočítávání od 100 do 0 s \r
musíte si dávat pozor na přepsání celé předchozí délky, jinak vaše odpočítávání půjde od (například) 100 do 990 (tj. předchozí "0" zůstane nedotčena).
Všimněte si však, že zatímco zpětná mezera na řádku normálně funguje, zpětná mezera na začátku řádku může nebo nemusí přesunout kurzor/pozici zápisu zpět na předchozí řádek. Pro většinu praktických účelů se můžete pohybovat pouze v rámci jednoho řádku.
zkuste použít \r
místo \n
při tisku nové "verze".
for(int i=0;i<=100;++i) printf("\r[%3d%%]",i);
printf("\n");