簡體   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