2013-02-25 56 views
4

我想要做什麼:清除只有控制檯輸出的一部分

光標開始閃爍在屏幕的左上角:剩餘

160個字符_

當我按'i'時:

159個剩餘字符

在按下 'A':

158個剩餘字符

IA

在按下 'M':

157個剩餘字符

IAM

等。

什麼需要做的(據我):

  1. 需要清除屏幕只有前三個字符。
  2. 更新屏幕

在新的按鍵我曾嘗試:

我試圖清除整個屏幕,並寫在那裏以前回來就可以了一切。

爲什麼我不快樂與我所做的:

因爲它給出了一個生澀的外觀。入口並不平坦。

我需要你幫我:

一些內置的功能或其他技術來清除只有屏幕的一部分。

我的規格:

的Windows XP SP 3

IDE:的Visual C++ 2010速成

+0

你有什麼平臺?在Linux上,ncurses將幫助操縱終端屏幕。 – aggsol 2013-02-25 08:50:08

+0

我正在使用Windows機器 – IcyFlame 2013-02-25 08:50:25

+0

不知道Windows中的控制檯是否具有此功能,但可以嘗試使用[PDCurses](http://pdcurses.sourceforge.net/doc/index.html),它是一個Windows端口爲Curses圖書館 – 2013-02-25 09:02:37

回答

5

要了解的第一件事是,C++沒有屏幕的概念,作爲標準的一部分的語言。標準輸出可能是一個文件,打印機和cout不知道區別。

然而,屏幕「設備」本身通常稍微聰明一些,並且可以識別一些命令。其中應用最廣泛的是'\ r' - 回車和'\ n' - 換行符。 '\ r'將光標移動到行的開頭,'\ n'前進到下一行,但這不符合您的需求,因爲您已經嘗試過。

看來,這裏的唯一方法是使用curses(其中ncurses只是一個實現,儘管是Linux中的標準實現)。它向您展示一個虛擬屏幕,其中包含各種命令來更新它們。然後它僅取出更改的部分,並以優化的方式更新終端。

這只是使用ncurses的典型的C程序的例子,可能是值得看一看:

#include <ncurses.h> 

int main() 
{ 
    int ch; 

    initscr();    /* Start curses mode  */ 
    raw();     /* Line buffering disabled */ 
    keypad(stdscr, TRUE); /* We get F1, F2 etc..  */ 
    noecho();    /* Don't echo() while we do getch */ 

    printw("Type any character to see it in bold\n"); 
    ch = getch();   /* If raw() hadn't been called 
          * we have to press enter before it 
          * gets to the program  */ 

    printw("The pressed key is "); 
    attron(A_BOLD); 
    printw("%c", ch); 
    attroff(A_BOLD); 

    refresh();   /* Print it on to the real screen */ 
    getch();   /* Wait for user input */ 
    endwin();   /* End curses mode  */ 

    return 0; 
} 

的printw()函數寫入一個「虛」屏幕。它將東西放入緩衝區並更新一些標誌並執行一些其他內部的ncurses簿記。它實際上並沒有寫任何東西到你的真實屏幕(控制檯窗口)。

你可以儘可能多的printw()寫作,但是這些東西不會顯示在真實的屏幕上,直到你的程序做了其他的事情來讓「虛構的」屏幕緩衝區內容轉到真實的屏幕。

導致真正的屏幕從printw()緩衝區更新的一件事是refresh()(正如上面的源代碼示例那樣)。

+0

哇,你是AK47和其他步槍的發明者嗎? :-O – 2013-02-25 09:16:35

+1

有一天,我決定最好去一些和平的事情,而不是爲什麼不是C++? Jk,這只是一個巧合。 :) – 2013-02-25 09:20:19

+0

嘿嘿在這裏等一下。你在說寫raw()會禁用緩衝區。這是否意味着所有輸入的字符都沒有緩衝區,並且noecho()沒有echo? – IcyFlame 2013-02-26 07:43:16

1

如果你想管理完整的屏幕,curses是 去的方式。否則,只需使用轉義序列就可以做很多事情;例如, 參見http://en.wikipedia.org/wiki/ANSI_escape_code。 (從歷史上看,這樣的序列從一個終端到另一個終端不同,並且詛咒原本是一種解決這個問題的方法。 今天,ANSI轉義代碼對於窗口系統下的控制檯 窗口非常普遍,被Windows 控制檯窗口和xterm的。)

除了封裝的實際序列,curses 支持字符輸入取向,有或沒有回聲。這個 是沒有詛咒更難做的,而且還是非常不可移植的。

+0

謝謝@詹姆斯Kanze – IcyFlame 2013-02-25 09:19:37

2

Win32控制檯不支持轉義序列。您可以使用Console API

掃清前3個字符(0,0)從您的控制檯

#include <windows.h> 

int main() 
{ 
    HANDLE hOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); 

    COORD coord = {0,0}; 
    ::SetConsoleCursorPosition(hOutput, coord); 

    char buff[] = " "; 
    ::WriteConsoleA(hOutput, buff, 3, NULL, NULL); 

    return 0; 
} 

如果你不喜歡Console API並希望使用ncurses模擬微小的例子,看到there

+0

那麼,請告訴我,這是否改變了光標的位置,或者只是在提到的位置打印這些東西? – IcyFlame 2013-02-26 09:25:05

+0

'SetConsoleCursorPosition'將光標位置改爲'(0,0)',然後'WriteConsoleA'從該位置開始寫入三個空格。 – Stas 2013-02-27 05:18:39