如何清除控制台
Posted
技术标签:
【中文标题】如何清除控制台【英文标题】:How can I clear console 【发布时间】:2011-06-26 19:45:36 【问题描述】:如标题所示。如何在 C++ 中清除控制台?
【问题讨论】:
在什么操作系统上? Linux 与 Windows 上的情况有很大不同,仅举一个例子。如果你想要它用于 Windows,请参阅:***.com/questions/5866529/… 你是打印一堆行然后清空,还是每行清空? 有时我想重置控制台视图。我不想用数百万个换行符向控制台发送垃圾邮件。 我在 C 中使用控制台窗口句柄询问了 how to do this。 This is the answer 我收到了。希望它对您的情况有所帮助。 【参考方案1】:对于纯 C++
你不能。 C++ 甚至没有控制台的概念。
该程序可能正在打印到打印机,直接输出到文件,或者被重定向到另一个程序的输入以进行所有它关心的事情。即使您可以在 C++ 中清除控制台,也会使这些情况变得更加混乱。
请参阅 comp.lang.c++ 常见问题解答中的此条目:
http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.20操作系统特定
如果在您的程序中清除控制台仍然有意义,并且您对特定于操作系统的解决方案感兴趣,那么这些解决方案确实存在。
对于 Windows(如您的标签中所示),请查看此链接:
How do we clear the console in assembly?编辑:这个答案之前提到过使用system("cls");
,因为微软说过要这样做。然而,在 cmets 中已经指出 this is not a safe thing to do。由于这个问题,我删除了指向 Microsoft 文章的链接。
库(有点便携)
ncurses 是一个支持控制台操作的库:
http://www.gnu.org/software/ncurses/(在 Posix 系统上运行) http://gnuwin32.sourceforge.net/packages/ncurses.htm(有点旧的 Windows 端口)【讨论】:
@Alf:我是从 MS 文章中复制粘贴的,所以投反对票,而不是我;)不过我会修复它。 来源无关紧要——甚至不能编译(使用 g++)的代码是不好的。但既然你修好了它,我就删除了反对票。 :-) @YoushaAleayoub 编辑了答案,删除了建议使用system
的 MS 链接,并在您的文章中添加了一个链接来解释原因。【参考方案2】:
对于 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
实在是太丑了。
【讨论】:
"为此使用系统实在是太丑了。" - 为什么?当然对我来说看起来更干净:) @MerlynMorgan-Graham:它会生成一个 shell 进程来清除该死的控制台。这是一个干净的解决方案吗? :P 这就像通过system()
使用echo
而不是写入标准输出。
单班轮 FTW! ;) 是的,我在开玩笑。它产生一个 shell 进程的事实是你回答的好信息。 +1 *nix 版本。
Using system()
is a common mistake. So, too, is your suggested method for Unices. This is what one should do on POSIX systems. 你说对了 Win32 部分,尽管你没有加入“回滚”约定。
不需要存档。 jdebp.eu./FGA/clearing-the-tui-screen.html#CLS 存在。【参考方案3】:
适用于 Linux/Unix,也许还有其他一些,但不适用于 10 TH2 之前的 Windows:
printf("\033c");
将重置终端。
【讨论】:
【参考方案4】:对我来说最简单的方法,无需重新发明***。
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
在 Windows 上,您可以使用 "conio.h" 标头并调用 clrscr 函数来避免使用 system 功能。
#include <conio.h>
clrscr();
在 Linux 上,您可以使用 ANSI Escape 序列来避免使用 system 函数。检查此参考ANSI Escape Sequences
std::cout<< u8"\033[2J\033[1;1H";
在 MacOS 上
正在调查...
【讨论】:
对我不起作用:打印TERM environment variable not set.
【参考方案5】:
向窗口控制台输出多行是没有用的..它只是向它添加空行。 遗憾的是,方式是特定于 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" ) );
【讨论】:
【参考方案6】:// #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;
【讨论】:
【参考方案7】:要清除屏幕,您首先需要包含以下标题:
#include <stdlib.h>
这将导入 windows 命令。然后您可以使用“系统”功能运行批处理命令(编辑控制台)。在 C++ 中的 Windows 上,清除屏幕的命令是:
system("CLS");
这将清除控制台。整个代码如下所示:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
system("CLS");
这就是你所需要的!祝你好运:)
【讨论】:
system("cls") 不是解决此问题的便携式解决方案,但它确实适用于 Windows 系统。 那不是“模块”。 C++ 没有“模块”。此外,stdlib.h
是由 C 标准指定的,与“导入 windows 命令”无关,也与 Windows 本身无关。除了挑剔之外,你很好。【参考方案8】:
在 Windows 中:
#include <cstdlib>
int main()
std::system("cls");
return 0;
在 Linux/Unix 中:
#include <cstdlib>
int main()
std::system("clear");
return 0;
【讨论】:
【参考方案9】:这在 MAC 上很难做到,因为它无法访问有助于清除屏幕的 windows 功能。我最好的解决方法是循环并添加行,直到终端清晰,然后运行程序。但是,如果您主要且经常使用它,那么它的效率或对内存不友好。
void clearScreen()
int clear = 5;
do
cout << endl;
clear -= 1;
while (clear !=0);
【讨论】:
【参考方案10】:使用system("cls")
清屏:
#include <stdlib.h>
int main(void)
system("cls");
return 0;
【讨论】:
已在接受的答案中提到。这里没有新信息。 然后摆脱 cout/wcout 并简单地将内容传输到系统(“echo” + 你的输出);【参考方案11】:在 Windows 中,我们有多种选择:
clrscr()(头文件:conio.h)
system("cls")(头文件:stdlib.h)
在 Linux 中,使用 system("clear")(头文件:stdlib.h)
【讨论】:
请注意,任何对 system() 的调用都可能是一个安全问题。【参考方案12】:如果您使用的是 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);
这就是system("cls");无需创建流程即可。
【讨论】:
【参考方案13】:效果很好:
#include <windows.h>
void clearscreen()
HANDLE hOut;
COORD Position;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
Position.X = 0;
Position.Y = 0;
SetConsoleCursorPosition(hOut, Position);
【讨论】:
【参考方案14】:这是一个简单的方法:
#include <iostream>
using namespace std;
int main()
cout.flush(); // Flush the output stream
system("clear"); // Clear the console with the "system" function
【讨论】:
【参考方案15】:使用 System::Console::Clear();
这将清除(清空)缓冲区
【讨论】:
[错误]“系统”尚未声明。 这是用于 c++/CLI(又名 .NET c++)的【参考方案16】:#include <cstdlib>
void cls()
#if defined(_WIN32) //if windows
system("cls");
#else
system("clear"); //if other
#endif //finish
在任何地方都可以调用 cls()
【讨论】:
这不是 OP 想要的。阅读添加到问题中的评论。【参考方案17】:#include <bits/stdc++.h>
int main()
int arr[] = 10, 5, 8 ,20, 2, 18;
int n = sizeof(arr)/sizeof(arr[0]);
system("cls");
print_array(arr, n);
return 0;
这很简单。在开始打印之前输入system("cls");
行。
【讨论】:
这已经在其他几个答案中提出。【参考方案18】:使用: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;
唯一的问题是软件光标;取决于平台/控制台的闪烁的东西(或不闪烁的东西)将位于控制台的末端,而不是它的顶部。但是,希望这永远不会引起任何麻烦。
【讨论】:
这个答案是a common mistake。以上是关于如何清除控制台的主要内容,如果未能解决你的问题,请参考以下文章