2013-02-25 57 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