用C ++清除控制台

时间:2011-10-27 02:36:41

标签: c++

我试图用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库函数。

提前谢谢!

3 个答案:

答案 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
}