いくつかの価値のある微妙な点...
\33[2K
現在カーソルがある行全体を消去します
\033[A
カーソルを 1 行上に移動しますが、同じ列に移動します つまり、行頭ではありません
\r
カーソルを行の先頭に移動します (r はキャリッジ リターンを表します。注意:キャリッジ リターンには改行が含まれないため、カーソルは同じ行に残ります) が、移動しません 何でも消す
特にxtermでは、上記の返信を試しましたが、行を消去して最初からやり直すことがわかった唯一の方法は、シーケンスです(@ Stephan202と@vlpおよび@mantalによって投稿された上記のコメントから) \33[2K\r
実装ノートでは、改行文字 '\n'
を使用していなかったので、カウントダウン シナリオなどで適切に動作させるために 各 fprintf()
の終わりに 、だから fflush()
しなければならなかった 毎回ストリーム (コンテキストを提供するために、標準出力をリダイレクトせずに Linux マシンでフォークを使用して xterm を開始しました。バッファリングされた FILE ポインター fdfile
に書き込みました。 私の場合は /dev/pts/21
だった疑似端末アドレスに座っていたノンブロッキングファイル記述子を使用して ):
fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
\r
が続く行を消去するために \33[2K シーケンスの両方を使用したことに注意してください。 改行シーケンスを使用して、カーソルを行の先頭に再配置します。 fflush()
しなければならなかった 各 fprintf()
の後 最後に改行文字がないため '\n'
. fflush() を必要とせずに同じ結果を得るには、1 行上に移動する追加のシーケンスが必要になります:
fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
書き込みたい行のすぐ上の行に何かがある場合、最初の fprintf() で上書きされることに注意してください。最初に 1 行上に移動できるように、上に余分な行を残す必要があります:
i = 3;
fprintf(fdfile, "\nText to keep\n");
fprintf(fdfile, "Text to erase****************************\n");
while(i > 0) { // 3 second countdown
fprintf(fdfile, "\033[A\33[2KT\rT minus %d seconds...\n", i);
i--;
sleep(1);
}
VT100 エスケープ コードを使用できます。 xterm を含むほとんどの端末は、VT100 対応です。行を消去する場合、これは ^[[2K
です . C では次のようになります:
printf("\33[2K\r");
\r
を使用できます (キャリッジリターン) カーソルを行頭に戻す:
printf("hello");
printf("\rbye");
bye と表示されます 同じ行に。ただし、既存の文字は消去されません。さようなら hello より短い 、あなたは byelo で終わるでしょう .それを消去するには、新しい印刷物を長くして余分な文字を上書きすることができます:
printf("hello");
printf("\rbye ");
または、最初にいくつかのスペースを削除してから、新しい文字列を印刷してください:
printf("hello");
printf("\r ");
printf("\rbye");
hello と表示されます 、次に行の先頭に移動してスペースで上書きし、再び先頭に戻って bye を出力します .