如何清除控制台

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;
      

【讨论】:

“它曾经是 中的一个函数,在旧的 Borland C 编译器中。它不是 C++ 标准函数。” ***.com/a/930141/1058115【参考方案19】:

最简单的方法是多次刷新流(最好比任何可能的控制台都大)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。

以上是关于如何清除控制台的主要内容,如果未能解决你的问题,请参考以下文章

如何清除控制台

如何清除控制台

如何清除控制台

如何清除控制台

如何清除控制台

如何清除python控制台