我试图用C ++清除控制台。我知道打印一些新行是一种不好的做法,因为它可能很慢并且并不总是可靠地完全清除控制台窗口,但我已经研究了多个选项并且除了system("cls")
之外几乎找不到其他解决方案,是一个更糟糕的选择。
基本上,我使用了行cout << string(100, '\n');
但是当我尝试运行程序时,我收到了一个几乎无法识别的错误。
error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::basic_string<_Elem,_Traits,_Ax>' (or there is no acceptable conversion)
我也对此进行了研究,发现大多数解释对我来说都太复杂了,因为我不能理解或完全与我的问题无关。
我的问题是(1)有没有办法解决这个错误,(2)除了打印100个换行符之外,还有更好的跨平台清理控制台的方法吗? < / p>
我也听说过Console.clear()
,但我不确定这是否是跨平台的。从我所看到的,它看起来更像是一个Windows命令。我也听说过curses
库,我愿意研究和使用它,直到我读到某处不建议使用我熟悉的函数和curses库函数。
提前谢谢!
答案 0 :(得分:3)
猜测一下,你的直接问题是可能你错过了#include <string>
。
处理屏幕的最便携方式可能是通过ncurses。它包含在POSIX和大多数类似POSIX的系统中,并且可以作为大多数其他系统(例如Windows)的库提供。
编辑:对于它的价值,在Windows上清除屏幕不需要接近100行代码。
#include <windows.h>
void clear_screen(char fill = ' ') {
COORD tl = {0,0};
CONSOLE_SCREEN_BUFFER_INFO s;
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(console, &s);
DWORD written, cells = s.dwSize.X * s.dwSize.Y;
FillConsoleOutputCharacter(console, fill, cells, tl, &written);
FillConsoleOutputAttribute(console, s.wAttributes, cells, tl, &written);
SetConsoleCursorPosition(console, tl);
}
#ifdef TEST
int main(){
clear_screen();
return 0;
}
#endif
我是第一个说代码比我想要的更冗长的代码 - 但它不到十行,更不用说一百行了。甚至MS知识库中的版本实际上也不到40行 - 其中许多是空白或评论。
但是,公平地说,我觉得有必要承认直接写入硬件(或使用BIOS)的汇编语言代码最终会缩短。
答案 1 :(得分:3)
关于你的错误......你必须......
#include <iostream>
#include <string>
using namespace std;
如果您只使用Windows,请使用Windows控制台API。 如果您使用的是linux \ unix终端,请使用转义码。 您可以在#if中选择两种方法。
在linux \ unix上使用以这种方式定义的write函数:
write(1,"\E[H\E[2J",7); // we use ANSI escape sequences here.
这是微软页面,解释了如何做到这一点。
http://support.microsoft.com/kb/99261
真正糟糕的控制台api microsoft用于控制台总是让我生气:)为什么100行代码清除屏幕? :)
现在if ...你应该创建一个clearscreen.h文件和一个clearscreen.cpp文件。
在clearscreen.h中我们只是放置了我们的功能。
void clearconsole();
在clearscreen.cpp中,我们为两个操作系统设置了代码
#ifdef _WIN32 || _WIN64
#include <windows.h>
void clearconsole()
{
...
// 100 lines of codes copied from microsoft article
}
#else
#include <unistd.h>
void clearconsole()
{
write(1,"\E[H\E[2J",7);
}
#endif
答案 2 :(得分:1)
我知道这是一个完整的死灵。但是我发现我觉得这是一个相当不错的解决方案,并认为我会分享它,以防万一将来有人遇到这个问题。
void clearConsole() {
#ifdef _WIN32
#include <iostream>
static const char* CSI = "\33[";
printf("%s%c%s%c", CSI, 'H', CSI, '2J');
#else
#include <unistd.h>
write(1, "\E[H\E[2J", 7);
#endif
}