C - 保持印刷终端输出到位

时间:2013-05-29 18:19:59

标签: c ncurses

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

我想要的是保持顶部标题信息到位,然后在其下连续打印其余数据。这样,标题信息不会滚动到屏幕顶部。最简单的方法是什么?

编辑:我在linux上。

2 个答案:

答案 0 :(得分:1)

根据您的一般描述,您可以执行以下操作。

#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, "%s\n", "Info 1");
    wprintw(w, "%s\n", "Info 2");
    wprintw(w, "%s\n", "Info 3");
    wprintw(w, "%s\n", "Info 4");
    wrefresh(w);
    i = 0;
    wsetscrreg(w, 4, LINES-1);
    while (++i) {
        wprintw(w, "%d\n", i);
        wrefresh(w);
        if (quit_flag) break;
    }
    endwin();
    return 0;
}

答案 1 :(得分:0)

建议的答案有几个问题:

  • 在循环中调用wsetscrreg是不必要的
  • 在信号处理程序中调用endwin是不安全的。请参阅signal handlers手册页中的initscr部分。

这是更正版本:

#include <curses.h>

int main (void) {
    int i;
    WINDOW *w;
    w = initscr();
    scrollok(w, 1);
    wsetscrreg(w, 4, LINES-1);
    wprintw(w, "%s\n", "Info 1");
    wprintw(w, "%s\n", "Info 2");
    wprintw(w, "%s\n", "Info 3");
    wprintw(w, "%s\n", "Info 4");
    wrefresh(w);
    i = 0;
    while (++i) {
        wprintw(w, "%d\n", 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("%s\n", "Info 1");
    printw("%s\n", "Info 2");
    printw("%s\n", "Info 3");
    printw("%s\n", "Info 4");
    refresh();
    i = 0;
    while (++i) {
        printw("%d\n", i);
        refresh();
    }
    endwin();
    return 0;
}