Cを使用してアプリケーションを実行している端末で回転カーソルを印刷する

StackOverflow https://stackoverflow.com/questions/199336

  •  11-07-2019
  •  | 
  •  

質問

標準Cを使用して端末で実行されるユーティリティで、回転するカーソルをどのように印刷しますか?

印刷するものを探しています:\ | /-画面上の同じ位置で何度も繰り返しますか?

ありがとう

役に立ちましたか?

解決

次のようにバックスペース文字( \ b )を使用できます:

printf("processing... |");
fflush(stdout);
// do something
printf("\b/");
fflush(stdout);
// do some more
printf("\b-");
fflush(stdout);

など通常、stdoutは改行を出力するまでバッファされるため、 fflush(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;
}

ずっと前にやったことがあります。 2つの方法があります。

  1. ncursesなどのライブラリを使用して、ターミナルを制御します。これは、この種のことをたくさんやりたい場合にうまく機能します。これを1つの小さな場所に1つだけ入れると、明らかに過剰になります。

  2. 制御文字を印刷します。

最初に&quot; /&quot;を印刷し、次に0x08(バックスペース)、次に&quot;-''、次に0x08、次に&quot; \&quot;を印刷します....

バックスペース文字はカーソル位置を1スペース戻しますが、現在の文字は上書きするまでそこに残ります。タイミングを正しく設定して(高速または低速に回転しないようにします)、あなたは最高です。

\ 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;
}

真の「標準」はありません。 C標準ライブラリ( http://members.aol.com/wantondeb/)は、生のターミナル/コンソール出力を行う機能を提供しません。

DOS / Windowsコンソールでは、標準的な方法で を使用します。 conio.h 、Unix / Linuxではこの目的に使用できるライブラリはです ncurses ncurses は、基本的に、MBCookが記述する制御文字の動作を端末に依存しない方法でカプセル化します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top