我有一个简单的c程序,它首先打印与用户机器相关的信息:
Header Info 1
Header Info 2
Header Info 3
然后打印与上述相关的数据列:
XX XX XX XX XX
XX XX XX XX XX
XX XX XX XX XX
XX XX XX XX XX
...
我想要的是保持顶部标题信息的位置,然后在它下面连续打印其余的数据。这样,标题信息就不会滚动出屏幕顶部。最简单的方法是什么?
编辑:I am on linux.
根据您的总体描述,您可以这样做。
#include <stdlib.h>
#include <signal.h>
#include <curses.h>
static int quit_flag;
void sigint_handler (int sig) {
quit_flag = 1;
}
int main () {
int i;
WINDOW *w;
signal(SIGINT, sigint_handler);
w = initscr();
scrollok(w, 1);
wsetscrreg(w, 4, LINES-1);
wprintw(w, "%sn", "Info 1");
wprintw(w, "%sn", "Info 2");
wprintw(w, "%sn", "Info 3");
wprintw(w, "%sn", "Info 4");
wrefresh(w);
i = 0;
wsetscrreg(w, 4, LINES-1);
while (++i) {
wprintw(w, "%dn", i);
wrefresh(w);
if (quit_flag) break;
}
endwin();
return 0;
}
建议的答案有几个问题:
- 在循环中调用wsetscreg是不必要的 在信号处理程序中调用endwin是不安全的。参见
initscr
手册页中的信号处理程序部分。这是更正后的版本:
#include <curses.h>
int main (void) {
int i;
WINDOW *w;
w = initscr();
scrollok(w, 1);
wsetscrreg(w, 4, LINES-1);
wprintw(w, "%sn", "Info 1");
wprintw(w, "%sn", "Info 2");
wprintw(w, "%sn", "Info 3");
wprintw(w, "%sn", "Info 4");
wrefresh(w);
i = 0;
while (++i) {
wprintw(w, "%dn", i);
wrefresh(w);
}
endwin();
return 0;
}
进一步,实现initscr
的返回值为stdscr
,程序可简化为:
#include <curses.h>
int main (void) {
int i;
initscr();
scrollok(stdscr, 1);
setscrreg(4, LINES-1);
printw("%sn", "Info 1");
printw("%sn", "Info 2");
printw("%sn", "Info 3");
printw("%sn", "Info 4");
refresh();
i = 0;
while (++i) {
printw("%dn", i);
refresh();
}
endwin();
return 0;
}