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