如何清除控制台

How can I clear console

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

如标题中所示。如何在C++中清除控制台?

用于纯C++

你不能。 C++甚至没有控制台的概念。

该程序可以打印到打印机,直接输出到文件,或者重定向到另一个程序的输入,以解决它所关心的一切。 即使您可以在C++中清除控制台,也会使这些情况变得更加混乱。

请参阅 comp.lang.c++ FAQ 中的此条目:

  • https://isocpp.org/wiki/faq/input-output#clear-screen

特定于操作系统

如果清除程序中的控制台仍然有意义,并且您对特定于操作系统的解决方案感兴趣,则这些解决方案确实存在。

对于 Windows(如您的标签(,请查看此链接:

  • 我们如何清除程序集中的控制台?

编辑:这个答案之前提到过使用system("cls");,因为Microsoft说要这样做。但是,评论中指出这不是一件安全的事情。由于这个问题,我删除了Microsoft文章的链接。

库(有点便携(

ncurses 是一个支持控制台操作的库:

  • http://www.gnu.org/software/ncurses/(在 Posix 系统上运行(
  • http://gnuwin32.sourceforge.net/packages/ncurses.htm(有点旧的Windows端口(

对于 Windows,通过控制台 API:

void clear() {
    COORD topLeft  = { 0, 0 };
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO screen;
    DWORD written;
    GetConsoleScreenBufferInfo(console, &screen);
    FillConsoleOutputCharacterA(
        console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    FillConsoleOutputAttribute(
        console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
        screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    SetConsoleCursorPosition(console, topLeft);
}

它很乐意忽略所有可能的错误,但是嘿,这是控制台清除。不像system("cls")更好地处理错误。

对于 *nixes,您通常可以使用 ANSI 转义码,因此它将是:

void clear() {
    // CSI[2J clears screen, CSI[H moves the cursor to top-left corner
    std::cout << "x1B[2Jx1B[H";
}

为此使用system是丑陋的。

对我来说

最简单的方法,无需重新发明轮子。

void Clear()
{
#if defined _WIN32
    system("cls");
    //clrscr(); // including header file : conio.h
#elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
    system("clear");
    //std::cout<< u8"33[2J33[1;1H"; //Using ANSI Escape Sequences 
#elif defined (__APPLE__)
    system("clear");
#endif
}
  • Windows上,您可以使用"conio.h">标头并调用clrscr函数以避免使用系统功能。
#include <conio.h>
clrscr();
  • Linux 上,您可以使用 ANSI 转义序列来避免使用系统功能。检查此参考 ANSI 转义序列
    std::cout<< u8"33[2J33[1;1H"; 
  • MacOS 上调查。。。

对于 Linux/Unix,也许还有其他一些,但不适用于 10 TH2 之前的 Windows:

printf("33c");

将重置终端。

多行输出到窗口控制台是没有用的。它只是向其添加空行。可悲的是,方式是特定于Windows的,并且涉及conio.h(和clrscr((可能不存在,这也不是标准的标头(或Win API方法

#include <windows.h>
void ClearScreen()
  {
  HANDLE                     hStdOut;
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  DWORD                      count;
  DWORD                      cellCount;
  COORD                      homeCoords = { 0, 0 };
  hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
  if (hStdOut == INVALID_HANDLE_VALUE) return;
  /* Get the number of cells in the current buffer */
  if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
  cellCount = csbi.dwSize.X *csbi.dwSize.Y;
  /* Fill the entire buffer with spaces */
  if (!FillConsoleOutputCharacter(
    hStdOut,
    (TCHAR) ' ',
    cellCount,
    homeCoords,
    &count
    )) return;
  /* Fill the entire buffer with the current colors and attributes */
  if (!FillConsoleOutputAttribute(
    hStdOut,
    csbi.wAttributes,
    cellCount,
    homeCoords,
    &count
    )) return;
  /* Move the cursor home */
  SetConsoleCursorPosition( hStdOut, homeCoords );
  }

对于POSIX系统,它更简单,您可以使用ncurses或终端函数

#include <unistd.h>
#include <term.h>
void ClearScreen()
  {
  if (!cur_term)
    {
    int result;
    setupterm( NULL, STDOUT_FILENO, &result );
    if (result <= 0) return;
    }
  putp( tigetstr( "clear" ) );
  }
// #define _WIN32_WINNT 0x0500     // windows >= 2000 
#include <windows.h> 
#include <iostream>
using namespace std; 
void pos(short C, short R)
{
    COORD xy ;
    xy.X = C ;
    xy.Y = R ;
    SetConsoleCursorPosition( 
    GetStdHandle(STD_OUTPUT_HANDLE), xy);
}
void cls( )
{
    pos(0,0);
    for(int j=0;j<100;j++)
    cout << string(100, ' ');
    pos(0,0);
} 
int main( void )
{
    // write somthing and wait 
    for(int j=0;j<100;j++)
    cout << string(10, 'a');
    cout << "nnpress any key to cls... ";
    cin.get();
    // clean the screen
    cls();
    return 0;
}

要清除屏幕,您首先需要包含以下标头:

#include <stdlib.h>

这将导入 Windows 命令。然后,您可以使用"系统"功能运行批处理命令(用于编辑控制台(。在 C++ 的 Windows 上,清除屏幕的命令将是:

system("CLS");

这将清除控制台。整个代码如下所示:

#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
system("CLS");
}

这就是你所需要的!Goodluck :)

在 Windows 中:

#include <cstdlib>
int main() { 
    std::system("cls");
    return 0;
}

在 Linux/Unix 中:

#include <cstdlib>
int main() { 
    std::system("clear");
    return 0;
}

这在MAC上很难做到,因为它无法访问可以帮助清除屏幕的Windows功能。我最好的解决方法是循环并添加行,直到终端清除,然后运行程序。但是,如果您主要且经常使用它,则效率不高或内存友好。

void clearScreen(){
    int clear = 5;
    do {
        cout << endl;
        clear -= 1;
    } while (clear !=0);
}

使用 system("cls") 清除屏幕:

#include <stdlib.h>
int main(void)
{
    system("cls");
    return 0;
}

在Windows中,我们有多个选项:

  1. clrscr(( (头文件 : conio.h(

  2. system("cls"( (头文件 : stdlib.h(

在 Linux 中,使用 system("clear"( (头文件 : stdlib.h(

如果你在 Windows 上:

HANDLE h;
CHAR_INFO v3;
COORD v4;
SMALL_RECT v5;
CONSOLE_SCREEN_BUFFER_INFO v6;
if ((h = (HANDLE)GetStdHandle(0xFFFFFFF5), (unsigned int)GetConsoleScreenBufferInfo(h, &v6)))
{
    v5.Right = v6.dwSize.X;
    v5.Bottom = v6.dwSize.Y;
    v3.Char.UnicodeChar = 32;
    v4.Y = -v6.dwSize.Y;
    v3.Attributes = v6.wAttributes;
    v4.X = 0;
    *(DWORD *)&v5.Left = 0;
    ScrollConsoleScreenBufferW(h, &v5, 0, v4, &v3);
    v6.dwCursorPosition = { 0 };
    HANDLE v1 = GetStdHandle(0xFFFFFFF5);
    SetConsoleCursorPosition(v1, v6.dwCursorPosition);
}

这就是系统("cls"(所做的,而不必创建一个进程来做到这一点。

效果非常好:

#include <windows.h>
void clearscreen()
{
    HANDLE hOut;
    COORD Position;
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    Position.X = 0;
    Position.Y = 0;
    SetConsoleCursorPosition(hOut, Position);
}

我使用的是Windows 10终端。

std::system("cls"); // cls or clear

这是一个简单的方法:

#include <iostream>
using namespace std;
int main()
{
    cout.flush(); // Flush the output stream
    system("clear"); // Clear the console with the "system" function
}

我不认为使用系统命令(system(""); (是一个好习惯这些特定的任务,所以我做了一个清除控制台屏幕的功能C/C++,它几乎具有与 system("cls");,但只是不调用系统命令。(它适用于视窗(您可以将此函数复制到 C/C++ 代码中,以便可以使用此函数清除控制台屏幕,但检查 Windows.h 库是否包含在您的法典。这是代码:

void clrscr() {
    DWORD Unused = 0;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    COORD zerozeroc = {0, 0};
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    DWORD Length = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacterW(GetStdHandle(STD_OUTPUT_HANDLE), ' ', Length, zerozeroc, &Unused);
    FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), csbi.wAttributes, Length, zerozeroc, &Unused);
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), zerozeroc);
}

使用 System::Console::Clear((;

这将清除(清空(缓冲区

#include <cstdlib>
void cls(){
#if defined(_WIN32) //if windows
    system("cls");
#else
    system("clear");    //if other
#endif  //finish

}

只需在任何地方调用 cls((

use: clrscr((;

#include <iostream>
using namespace std;
int main()
      {           
         clrscr();
         cout << "Hello World!" << endl;
         return 0;
      }

最简单的方法是多次刷新流(理想情况下比任何可能的控制台更大( 1024*1024 可能是任何控制台窗口都不可能达到的大小。

int main(int argc, char *argv)
{
  for(int i = 0; i <1024*1024; i++)
      std::cout << ' ' << std::endl;
  return 0;
}

唯一的问题是软件光标;根据平台/控制台的不同,闪烁的东西(或不闪烁的东西(将位于控制台的末端,而不是它的顶部。但是,希望这永远不会引起任何麻烦。