仅清除控制台输出的一部分

Clearing only part of the console output

本文关键字:一部分 输出 控制台 清除      更新时间:2023-10-16

我想做的事情:

光标最初在屏幕左上角闪烁:

剩余160个字符
_

当我按下"I"时:

剩余159个字符

i

当我按下"a"时:

剩余158个字符

ia

当我按下'm'时:

剩余157个字符

iam

等等

需要做什么(根据我的说法(:

  1. 只需要清除屏幕的前三个字符
  2. 更新屏幕上新按下的键

我尝试过的:

我试着清空整个屏幕,把之前的所有内容都写回来

为什么我对自己的所作所为不满意:

因为它给人一种干巴巴的感觉。而且进入并不顺利。

我需要你帮我做什么:

一些内置功能或其他技术,只清除屏幕的一部分。

我的规格:

Windows XP SP 3

IDE:Visual C++2010学习版

首先要理解的是,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 boldn");
    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(((就像上面的源代码示例一样(。

Win32控制台不支持转义序列。您可以使用Console API。

从控制台中清除(0,0(处的前3个字符的小示例

#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模拟,请参阅。

如果您想管理整个屏幕,curses是去。否则,只需使用转义序列就可以做很多事情;看见http://en.wikipedia.org/wiki/ANSI_escape_code例如(从历史上看,这种序列从一个终端到接下来,诅咒本来就是解决这个问题的一种方法。如今,ANSI转义码在控制台中非常通用窗口系统下的窗口,由两个窗口使用控制台窗口和xterm.(

除了封装实际序列外,curses支持面向字符的输入,有或没有回声。这没有诅咒更难做到,而且仍然非常不可携带。