清除c++中的控制台

Clearing the Console in C++

本文关键字:控制台 c++ 清除      更新时间:2023-10-16

我试图在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)

我也对此进行了研究,发现大多数解释对于我这个初学c++的程序员来说太复杂了,或者与我的问题完全无关。

我的问题是(1)是否有办法解决这个错误,(2)除了打印100个换行符之外,是否有更好的,跨平台的清除控制台的方法?

我也听说过Console.clear(),但我不确定这是否是跨平台的。从我所看到的来看,它看起来更像是一个Windows命令。我也听说过curses库,我愿意研究和使用它,直到我在某处读到不建议将我熟悉的函数与curses库函数结合使用。

提前感谢!

关于你的错误…

#include <iostream> 
#include <string>
using namespace std;

如果您只使用windows,请使用windows控制台API。如果您使用的是linuxunix终端,请使用转义码。您可以使用#if在这两种方法之间进行选择。

在linuxunix中使用如下方式定义的write函数:

write(1,"E[HE[2J",7); // we use ANSI escape sequences here.

这是微软的网页,解释如何做到这一点。

http://support.microsoft.com/kb/99261

微软为主机使用的糟糕的控制台api总是让我生气:)为什么要用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[HE[2J",7);
    }
#endif

我猜,你的直接问题是可能你错过了一个#include <string>

处理屏幕的最方便的方法可能是通过护士。它包含在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

我是第一个说这段代码比我想要的更冗长的人——但它不到十行,更不用说一百行了。甚至微软知识库中的版本实际上也不到40行,其中许多是空白或注释。

公平地说,我觉得有义务承认直接将汇编语言代码编写到硬件(或使用BIOS)最终确实缩短了一些。

我知道这是一个彻底的死亡。但我想出了一个我觉得相当简洁的解决方案,我想分享一下,以防将来有人遇到这个问题。

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[HE[2J", 7);
#endif
}