"Animated" 文本输出

"Animated" text output

unix 命令top 等"animates" 的文本输出如何工作?我不确定这个问题的措辞,我的意思是 top 的输出使用固定数量的 space 并且文本发生变化而不是附加

这在 C 中如何完成?根据维基百科,top 是用 C 编写的:http://en.wikipedia.org/wiki/Top_%28software%29

Ed Heal 已将您指向 ncurses 库。此库允许您在控制台中创建文本 windows,您可以在其中放置光标。

ncurses 包在大多数 Unix 机器上可用,但您可能需要调整包含和库路径。

下面是一个非常粗略的时钟实现。它使用sleep来控制动画。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>           /* for time and localtime */
#include <unistd.h>         /* for sleep */

#include <curses.h>         /* might need to adjust -Ipath */

const char *glyph[10] = {
    " OOOO OO  OOOO  OOOO  OOOO  OOOO  OO OOOO ",
    "  OO   OOO    OO    OO    OO    OO  OOOOOO",
    " OOOO OO  OO    OO   OO  OO   OO    OOOOOO",
    " OOOO OO  OO    OO  OOO     OOOO  OO OOOO ",
    "    OO   OOO  OOOOOO  OOOOOOOO    OO    OO",
    "OOOOOOOO    OOOOO     OO    OOOO  OO OOOO ",
    " OOOO OO  OOOO    OOOOO OO  OOOO  OO OOOO ",
    "OOOOOOOO  OO    OO   OO   OO    OO    OO  ",
    " OOOO OO  OOOO  OO OOOO OO  OOOO  OO OOOO ",
    " OOOO OO  OOOO  OO OOOOO    OOOO  OO OOOO "
};

void showtime(WINDOW *win)
{
    time_t now = time(NULL);
    struct tm *tm = localtime(&now);

    int hh = tm->tm_hour;
    int mm = tm->tm_min;
    int ss = tm->tm_sec;
    int x;
    int i;

    x = (getmaxx(win) - 54) / 2;
    if (x < 0) x = 0;

    clear();
    for (i = 0; i < 7; i++) {
        move(i + 2, x);
        printw("%.6s  %.6s      %.6s  %.6s      %.6s  %.6s",
            glyph[hh / 10] + 6*i, glyph[hh % 10] + 6*i,
            glyph[mm / 10] + 6*i, glyph[mm % 10] + 6*i,
            glyph[ss / 10] + 6*i, glyph[ss % 10] + 6*i);
    }

    refresh();    
}

int main()
{
    WINDOW *win = initscr();

    if (win == NULL) exit(1);
    noecho();               /* Don't echo unser input */
    nodelay(win, TRUE);     /* Don't wait for keypresses */

    for (;;) {
        int key;

        key = getch();
        if (key != ERR) break;

        showtime(win);
        sleep(1);
    }

    delwin(win);
    endwin();

    return 0;
}