如标题中所示。如何清除C ++中的控制台?
Answers:
对于纯C ++
你不能 C ++甚至没有控制台的概念。
该程序可以将其打印到打印机,直接输出到文件或重定向到另一个程序的输入(无论它关心什么)。即使您可以清除C ++中的控制台,也会使这些情况更加混乱。
请参阅comp.lang.c ++常见问题解答中的此项:
特定于操作系统
如果清除程序中的控制台仍然有意义,并且您对特定于操作系统的解决方案感兴趣,那么这些解决方案确实存在。
对于Windows(如标签中所示),请查看以下链接:
编辑:此答案先前提到使用system("cls");
,因为Microsoft表示这样做。但是,在评论中已经指出,这样做不是安全的事情。由于此问题,我已删除了指向Microsoft文章的链接。
图书馆(有点可移植)
ncurses是一个支持控制台操作的库:
system
,并在您的文章中添加了一个解释原因的链接。
对于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[2J\x1B[H";
}
system
为此使用是丑陋的。
echo
viasystem()
而不是写入stdout一样。
将多行输出到窗口控制台是没有用的..它只是向其中添加空行。可悲的是,方法是特定于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 << "\n\npress any key to cls... ";
cin.get();
// clean the screen
cls();
return 0;
}
要清除屏幕,您首先需要包括一个模块:
#include <stdlib.h>
这将导入Windows命令。然后,您可以使用“系统”功能运行批处理命令(用于编辑控制台)。在Windows中,使用C ++,清除屏幕的命令为:
system("CLS");
这将清除控制台。整个代码如下所示:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
system("CLS");
}
这就是您所需要的!祝好运 :)
stdlib.h
是由C标准指定的,与“导入Windows命令”或Windows本身无关。除了挑剔,你还好。
在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;
}
在Windows中,我们有多种选择:
clrscr()(头文件:conio.h)
system(“ cls”)(头文件:stdlib.h)
在Linux中,使用system(“ clear”)(头文件:stdlib.h)
这是一种简单的方法:
#include <iostream>
using namespace std;
int main()
{
cout.flush(); // Flush the output stream
system("clear"); // Clear the console with the "system" function
}
使用系统:: Console :: Clear();
这将清除(清空)缓冲区
#include <cstdlib>
void cls(){
#if defined(_WIN32) //if windows
system("cls");
#else
system("clear"); //if other
#endif //finish
}
只需在任何地方调用cls()
您可以通过system(“”)使用操作系统的清除控制台方法;
对于Windows,它将是system(“ cls”); 例如
,而不是针对不同的操作系统发布三个不同的代码。只要制定一种方法来获取正在运行的操作系统。
您可以通过检测#ifdef是否存在唯一的系统变量来做到这一点,
例如
enum OPERATINGSYSTEM = {windows = 0, mac = 1, linux = 2 /*etc you get the point*/};
void getOs(){
#ifdef _WIN32
return OPERATINGSYSTEM.windows
#elif __APPLE__ //etc you get the point
#endif
}
int main(){
int id = getOs();
if(id == OPERATINGSYSTEM.windows){
system("CLS");
}else if (id == OPERATINGSYSTEM.mac){
system("CLEAR");
} //etc you get the point
}
编辑:完全重做问题
只需测试它们在哪个系统上,然后根据系统发送系统命令即可。尽管这将在编译时设置
#ifdef __WIN32
system("cls");
#else
system("clear"); // most other systems use this
#endif
这是一种全新的方法!
cout
可能已将其重定向到文件。然后根本没有控制台的概念。
使用: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;
}
唯一的问题是软件游标。取决于平台/控制台的闪烁物(或非闪烁物)将位于控制台的末尾,而不是其顶部。但是,这绝不希望引起任何麻烦。