2013-05-29 51 views
1

我有一個簡單的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上。

+1

哪個平臺,Linux和Windows中,或MAC。如果使用MAC,請使用curses庫。如果是Windows,請打開控制檯並查看其文檔。 – octopusgrabbus

+0

我編輯了原帖。我在Linux上。 – user1764386

+0

那麼你得到了詛咒。我從來沒有真正爲curses編寫代碼,但Informix 4GL使用它。那裏必須有C例子。 – octopusgrabbus

回答

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; 
} 
+0

我得到的SIGINT在此處未聲明。你介意解釋它的使用還是應該如何聲明? – user1764386

+0

@ user1764386:需要包含''。答案已更新。如果使用Ctrl-C退出程序,它將用於清除詛咒。 – jxh

+0

完美。感謝您的幫助。 – user1764386

0

建議的答案有幾個問題:

  • 調用內環路wsetscrreg是不必要的
  • 調用endwin在信號處理程序是不安全的。請參閱initscr手冊頁中的signal handlers部分。

這是一個修正版本:

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