coutを使用してタスクの進行状況を更新するタスク監視をコーディングしています。1行に1つのタスクの進行状況を表示したいので、コンソールの複数の行をロールバックする必要があります。
私は「いくつか」を主張します。なぜなら\b
、1行の仕事をするのですが、行の間で消去されない\n
からです。
試しましたが、-1(失敗)をstd::cout.seekp(std::cout.tellp() - str.length());
返しtellp()
ます。
現在の行の先頭にジャンプすることもできますがcout << '\r';
、上に移動するのはシステム固有です。Unixの場合は、およびを参照man termcap
してくださいman terminfo
(およびを検索してくださいcursor_up
)。ANSI互換端末(Unixで利用可能な最新の端末など)では、これは上に移動するように機能しますcout << "\e[A";
。
でシークしようとしないでくださいcout
。ほとんどの場合、シークできません(ファイルにリダイレクトされる場合を除く)。
他の回答で述べたように、ncurses(またはslang)ライブラリを使用すると、UnixのターミナルI/Oに優れた抽象化が提供されます。
\r
スペースで埋める代わりに(すべての端末の幅が80文字であるとは限らないため、エラーが発生しやすくなります)、 + clr_eol
:を実行できますstd::cout << "\r\e[K" << std::flush
。
可能であれば、 ncursesなどの出力フォーマットライブラリを使用してください。これにより、端末の操作が大幅に簡素化されます。
CもC++もそのようなものを定義していません。明示的な端末操作が必要です。Unixでは、 cursesを使用できます。Windowsに何があるのかわかりません。