如标题所述。如何在C++中清除控制台?
如标题所述。如何在C++中清除控制台?
对于纯C++
你不能这样做。C++甚至没有控制台的概念。
程序可以将输出打印到打印机,直接输出到文件,或被重定向到另一个程序的输入中。即使你可以在C++中清除控制台,它也会让这些情况变得更加混乱。
请参阅comp.lang.c++ FAQ中的这篇文章:
特定于操作系统
如果在您的程序中清除控制台仍然有意义,并且您想了解特定于操作系统的解决方案,那么这些解决方案确实存在。
对于Windows(如您的标签),请查看此链接:
编辑:之前提到使用system("cls");
,因为Microsoft建议这样做。但是在评论中指出这是不安全的。由于这个问题,我已经删除了指向Microsoft文章的链接。
库(相对便携)
ncurses是一个支持控制台操作的库:
system
的MS链接,并添加了指向您的文章解释原因的链接。 - Merlyn Morgan-Graham对于Windows,可以通过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);
}
它会快乐地忽略所有可能的错误,但是嘿,这是控制台清除。与system("cls")
一样,并不意味着可以更好地处理错误。
对于*nix,通常可以使用ANSI转义代码,所以可以这样做:
void clear() {
// CSI[2J clears screen, CSI[H moves the cursor to top-left corner
std::cout << "\x1B[2J\x1B[H";
}
使用 system
这个方法太丑陋了。
system()
来通过 echo
输出而不是直接写入标准输出流。 - Cat Plus Plussystem()
是常见的错误。您提出的方法在Unix系统中也是如此。这是在POSIX系统上应该采取的方法。虽然您没有包含“滚动回溯”约定,但Win32部分是正确的。 - JdeBP对我来说,最简单的方法是不必重新发明轮子。
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
}
#include <conio.h>
clrscr();
std::cout<< u8"\033[2J\033[1;1H";
对于Linux/Unix以及可能一些其他系统,但不适用于Windows 10 TH2之前的版本:
printf("\033c");
将重置终端。
将多个行输出到窗口控制台是没有用的,它只会在其中添加空行。 不幸的是,这种方法是针对 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 );
}
#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 << "\n\npress any key to cls... ";
cin.get();
// clean the screen
cls();
return 0;
}
#include <stdlib.h>
这将导入Windows命令。然后您可以使用“system”函数运行批处理命令(编辑控制台)。在C++中清除屏幕的命令为:
system("cls");
system("CLS");
这将清空控制台。整段代码如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
system("CLS");
}
这就是你需要的全部内容!祝你好运 :)
stdlib.h
是由C标准指定的,并且与“导入Windows命令”或Windows本身无关。除了这些小问题,你的表现很好。 - Lightness Races in Orbit#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;
}