仅清除控制台输出的一部分
Clearing only part of the console output
我想做的事情:
光标最初在屏幕左上角闪烁:
剩余160个字符
_
当我按下"I"时:
剩余159个字符
i
当我按下"a"时:
剩余158个字符
ia
当我按下'm'时:
剩余157个字符
iam
等等
需要做什么(根据我的说法(:
- 只需要清除屏幕的前三个字符
- 更新屏幕上新按下的键
我尝试过的:
我试着清空整个屏幕,把之前的所有内容都写回来
为什么我对自己的所作所为不满意:
因为它给人一种干巴巴的感觉。而且进入并不顺利。
我需要你帮我做什么:
一些内置功能或其他技术,只清除屏幕的一部分。
我的规格:
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
支持面向字符的输入,有或没有回声。这没有诅咒更难做到,而且仍然非常不可携带。
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么我的输出在到达代码的这一部分时冻结?
- 我如何从序列输出中确定程序的哪一部分没有获得互斥锁?
- 仅清除控制台输出的一部分