保持打印终端输出在适当的位置



我有一个简单的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;
}

最新更新