繁体   English   中英

C-将打印终端输出保持在原位

[英]C - keeping printed terminal output in place

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

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

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

建议的答案有两个问题:

  • 不需要在循环内调用wsetscrreg
  • 在信号处理程序中调用endwin是不安全的。 请参阅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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM