標準 C を使用する端末で実行されるユーティリティで回転するカーソルを出力するにはどうすればよいですか?
次のように表示されるものを探しています: \ | / - 画面上の同じ位置で何度も?
ありがとう
次のようにバックスペース文字 ( \b
)を使用できます。
printf("processing... |");
fflush(stdout);
// do something
printf("\b/");
fflush(stdout);
// do some more
printf("\b-");
fflush(stdout);
fflush(stdout)
など通常、stdout は改行を出力するまでバッファリングされるため、が必要です。
コード例を次に示します。タスクが完了するまで、ときどき Advance_cursor() を呼び出します。
#include <stdio.h>
void advance_cursor() {
static int pos=0;
char cursor[4]={'/','-','\\','|'};
printf("%c\b", cursor[pos]);
fflush(stdout);
pos = (pos+1) % 4;
}
int main(int argc, char **argv) {
int i;
for (i=0; i<100; i++) {
advance_cursor();
usleep(100000);
}
printf("\n");
return 0;
}
\ rを使用することもできます:
#include <stdio.h>
#include <unistd.h>
void
advance_spinner() {
static char bars[] = { '/', '-', '\\', '|' };
static int nbars = sizeof(bars) / sizeof(char);
static int pos = 0;
printf("%c\r", bars[pos]);
fflush(stdout);
pos = (pos + 1) % nbars;
}
int
main() {
while (1) {
advance_spinner();
usleep(300);
}
return 0;
}
私はずっと前にそれをしました。2 つの方法があります。
ncurses のようなライブラリを使用して、端末を制御できるようにします。この種のことをたくさんしたい場合、これはうまくいきます。これを 1 つの小さな場所に 1 つだけ配置すると、明らかにやり過ぎです。
制御文字を出力します。
最初に "/"、次に 0x08 (バックスペース)、次に "-"、次に 0x08、そして "\" を出力します....
バックスペース文字はカーソル位置を 1 スペース戻しますが、現在の文字は上書きするまでそこに残ります。タイミングを正しくとれば (回転が速くなったり遅くなったりすることはありません)、成功です。
C 標準ライブラリ ( http://members.aol.com/wantondeb/ ) は生の端末/コンソール出力を行う機能を提供していないため、これを行う真の「標準」方法はありません。
DOS/Windows コンソールでは、これを行う標準的な方法は を使用することですがconio.h
、Unix/Linux では、この目的で受け入れられているライブラリはncurses
(ncurses
基本的に、MBCook が記述する制御文字の動作を端末に依存しない方法でカプセル化します) です。