如何清除控制台

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

369273 次浏览

对于纯 C + +

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

The program could be printing to a printer, outputting straight to a file, or being redirected to the input of another program for all it cares. Even if you could clear the console in C++, it would make those cases significantly messier.

请参考 comp.lang.c + + FAQ 中的这个条目:

特定操作系统

If it still makes sense to clear the console in your program, and you are interested in operating system specific solutions, those do exist.

对于 Windows (就像你的标签一样) ,点击这个链接:

编辑: 这个答案之前提到使用 system("cls");,因为微软说要这样做。然而,评论中已经指出,这样做不安全。因为这个问题,我已经删除了 Microsoft 文章的链接。

Libraries (somewhat portable)

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

For Windows, via Console 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);
}

它很高兴地忽略了所有可能的错误,但是,嘿,它是控制台清除。

对于 * nixes,通常可以使用 ANSI 的转义码,所以应该是:

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

使用 system做这个实在是太难看了。

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

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


return 0;
}

这样做的唯一问题是软件光标; 依赖于平台/控制台的闪烁(或不闪烁)将位于控制台的末端,而不是顶端。然而,希望这不会引起任何麻烦。

要清除屏幕,您首先需要包括以下标题:

#include <stdlib.h>

这将导入 windows 命令。然后您可以使用“ system”函数来运行 Batch 命令(编辑控制台)。在 C + + 的 Windows 中,清除屏幕的命令是:

system("CLS");

这样就可以清除控制台,整个代码看起来是这样的:

#include <iostream>
#include <stdlib.h>


using namespace std;


int main()
{
system("CLS");
}

这就是你所需要的! 好运:)

使用系统: : 控制台: : Clear () ;

这将清除(清空)缓冲区

use: clrscr();

#include <iostream>
using namespace std;
int main()
{
clrscr();
cout << "Hello World!" << endl;
return 0;
}
// #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 << "\n\npress any key to cls... ";
cin.get();


// clean the screen
cls();


return 0;
}

在 Windows 中:

#include <cstdlib>


int main() {
std::system("cls");
return 0;
}

在 Linux/Unix 中:

#include <cstdlib>


int main() {
std::system("clear");
return 0;
}

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

#include <stdlib.h>


int main(void)
{
system("cls");
return 0;
}

输出多行到窗口控制台是没有用的。它只是添加空行到它。 遗憾的是,way 是特定于 Windows 的,它涉及到 conio.h (clrscr ()可能不存在,这也不是标准的 Header)或 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" ) );
}
#include <cstdlib>


void cls(){
#if defined(_WIN32) //if windows
system("cls");


#else
system("clear");    //if other
#endif  //finish

}

在任何地方调用 cls ()

在 MAC 上很难做到这一点,因为它无法访问可以帮助清除屏幕的 Windows 功能。我最好的解决办法是循环和添加行,直到终端清除,然后运行程序。然而,如果您主要并且经常使用它,那么它的效率或者内存友好性就会降低。

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

对于 Linux/Unix 或者其他一些操作系统而言,在10 TH2之前不适用于 Windows:

printf("\033c");

将复位终端。

Here is a simple way to do it:

#include <iostream>


using namespace std;


int main()
{
cout.flush(); // Flush the output stream
system("clear"); // Clear the console with the "system" function
}

对我来说最简单的方法就是不用重新发明轮子。

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"\033[2J\033[1;1H"; //Using ANSI Escape Sequences
#elif defined (__APPLE__)
system("clear");
#endif
}
  • 窗户上可以使用 “ Conioh”报头并调用 克里斯函数来避免使用 系统函数。
#include <conio.h>
clrscr();
  • Linux上你可以使用 ANSI 转义序列来避免使用 系统函数。检查这个参考 逃逸序列
    std::cout<< u8"\033[2J\033[1;1H";
  • 关于 < strong > MacOS 调查..。

在 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