ncurses のようなライブラリは、そのようなことに慣れていると思います。 curses は、カーソルを画面上で動かしたり、テキストなどを描画したりするのに役立ちます。
Ncurses
このようなもの:
std::stringstream out;
for (int i = 0; i< 10; i++)
{
out << "X";
cout << "\r" << "[" << out.str() << "]";
}
卑劣なビットは、カーソルを次の行に移動せずに行の先頭に移動させる復帰文字 "\r" です。
他の人は、 01
を使用できることをすでに指摘しています 現在の行の先頭に戻り、行全体を上書きします。
もう 1 つの可能性は、バックスペース文字 ("\b") を使用していくつかのスペースを消去し、それらのスペースのみを上書きすることです。これにはいくつかの利点があります。まず、ライン内のすべてを再生成する必要がないことは明らかです。これは、時には軽度の痛みを伴う場合があります (これはかなり珍しいことですが)。第二に、(一例として) 書き込み時にサイズが縮小するデータを表示する際の苦痛を回避できます。たとえば、100 から 0 までのカウントダウンを 19
前の長さ全体を上書きしないように注意する必要があります。そうしないと、カウントダウンが (たとえば) 100 から 990 になります (つまり、前の「0」はそのまま残ります)。
ただし、行内のバックスペースは通常は機能しますが、行の先頭でバックスペースを使用すると、カーソル/書き込み位置が前の行に戻る場合と移動しない場合があることに注意してください。ほとんどの実用的な目的では、1 行内でのみ移動できます。
28
を使ってみてください 30
の代わりに 新しい「バージョン」を印刷するとき。
for(int i=0;i<=100;++i) printf("\r[%3d%%]",i);
printf("\n");