8

次の行を使用して、シミュレーションの進行状況情報をC++プログラムに出力します。

double N=0;
double percent=0;
double total = 1000000;
for (int i; i<total; ++i)
{
    percent = 100*i/total;
    printf("\r[%6.4f%%]",percent);
}

それはうまくいきます!

しかし、問題は、ターミナルカーソルが数字を循環して点滅し続けるのを見るということです。これは非常に迷惑です。これを取り除く方法を知っている人はいますか?

wgetやubuntuaptのようなプログラムを見たことがありますが、プログレスバーやパーセンテージも使用していますが、カーソルの点滅の問題はないようです。どうやってそれを行ったのでしょうか。

ありがとう!

4

6 に答える 6

21

DECTCEMおよびで(DECテキストカーソル有効化モード)モードを使用して、カーソルを表示および非表示にすることができDECSMますDECRM

fputs("\e[?25l", stdout); /* hide the cursor */

fputs("\e[?25h", stdout); /* show the cursor */
于 2012-06-12T10:45:56.797 に答える
12

推測です。「\r」の代わりに適切な数の「\b」(バックスペース)文字を使用してみてください。

==編集==

私はLinuxシェルウィザードではありませんが、これは機能する可能性があります。

system("setterm -cursor off");
// ...display percentages...
system("setterm -cursor on");

#include <cstdlib>またはを忘れないでください<iostream>

于 2012-06-11T21:55:29.960 に答える
1

点滅するカーソルを回避する 1 つの方法は、(提案されているように) カーソルを一時的に非表示にすることです。

ただし、これはソリューションの一部にすぎません。プログラムでは、次のことも考慮する必要があります。

  • カーソルを非表示にして画面を変更した後、カーソルを再び表示するに元の場所に戻します
  • カーソルを非表示/表示すると、更新に時間がかからないときにカーソルが目立って点滅するのを防ぐだけです。これに時間のかかるプロセスが混在していると、カーソル点滅します。

を使用して提案されたソリューションsettermは移植性がありません。これは Linux コンソールに固有のものです。を使用して実行可能ファイルを実行するsystem必要はありません。でも走ってても

system("tput civis");
...
system("tput cnorm");

を使用するよりも改善されてsettermいます。

ソースコードをチェックすると、wgetカーソルを隠すエスケープシーケンスが見つかりません。プログレス バーに表示されているのは、時間のかかる処理を行うたびにカーソルがほぼ同じ場所にあることです。端末への出力には時間がかからないため、行が一時的に書き直されたことに気付かないほどです (キャリッジ リターンを出力してから、行の大部分をもう一度書き直すことにより)。速度が遅い場合は、カーソルを非表示にすることが役立ちます — ある程度までは.

ところで — このカーソル非表示テクニックは、一部のエディター ( vim およびvile ) のターミナルドライバーで使用されています。

于 2016-08-23T21:13:41.943 に答える
0

それらのアプリはおそらくncursesを使用しています。mvaddstrを参照

于 2012-06-11T21:42:31.097 に答える