我该如何清除控制台

Tho*_*s B 79 c++ windows console-application dev-c++

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

Mer*_*ham 62

对于纯C++

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

该程序可以打印到打印机,直接输出到文件,或重定向到另一个程序的输入,以满足它的所有需要​​.即使您可以在C++中清除控制台,也会使这些情况变得更加混乱.

请参阅comp.lang.c ++ FAQ中的此条目:

操作系统相关

如果清除程序中的控制台仍然有意义,并且您对特定于操作系统的解决方案感兴趣,那么这些解决方案确实存在.

对于Windows(如标记中所示),请查看此链接:

编辑:此答案之前提到使用system("cls");,因为微软说这样做.但是在评论中已经指出这不是一件安全的事情.由于此问题,我已删除了Microsoft文章的链接.

图书馆(有点便携)

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

  • 原点并不重要 - 甚至不能编译的代码(使用g ++)都是不合适的.但是,自从你修复它后,我删除了downvote.:-) (9认同)
  • @Alf:我从MS文章中复制粘贴,所以请注意它们,而不是我;)我会修复它. (6认同)

Cat*_*lus 47

对于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);
}
Run Code Online (Sandbox Code Playgroud)

它很高兴忽略了所有可能的错误,但是嘿,这是控制台清理.不喜欢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";
}
Run Code Online (Sandbox Code Playgroud)

使用system它只是丑陋.

  • @ MerlynMorgan-Graham:它产生了一个shell进程来清除一个friggin'控制台.这是一个干净的解决方案?:P就像通过`system()`使用`echo`而不是写入stdout. (13认同)
  • [使用`system()`是一个常见的错误.](http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/clearing-the-tui-screen.html#CLS) [所以,你也是Unices的建议方法.](http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/clearing-the-tui-screen.html#ANSI)[这是人们应该对POSIX系统做的事情.](http ://homepage.ntlworld.com./jonathan.deboynepollard/FGA/clearing-the-tui-screen.html#POSIX)你的Win32部分是正确的,尽管你没有采用"回滚"惯例. (6认同)
  • "使用系统只是丑陋." - 为什么?当然看起来更干净:) (4认同)
  • 一艘班轮 FTW!;) 是的,我是在开玩笑。事实上,它生成了一个 shell 进程,这对于您的答案来说是很好的信息。*nix 版本+1。 (2认同)
  • @ MerlynMorgan-Graham:嗯,这是一个班轮.`clear();`;) (2认同)

Jom*_*oma 25

对我来说最简单的方法而不必重新发明轮子。

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
}
Run Code Online (Sandbox Code Playgroud)
  • Windows 上,您可以使用“conio.h”头文件并调用clrscr函数来避免使用系统功能。
#include <conio.h>
clrscr();
Run Code Online (Sandbox Code Playgroud)
  • Linux 上,您可以使用 ANSI 转义序列来避免使用系统函数。检查此参考ANSI 转义序列
    std::cout<< u8"\033[2J\033[1;1H"; 
Run Code Online (Sandbox Code Playgroud)
  • MacOS 上 调查...


NoA*_*gel 16

对于Linux/Unix以及其他一些但在10 TH2之前不适用于Windows:

printf("\033c");
Run Code Online (Sandbox Code Playgroud)

将重置终端.


Swi*_*Pie 7

将多行输出到窗口控制台是没有用的..它只是向其中添加空行。可悲的是,方法是特定于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 );
  }
Run Code Online (Sandbox Code Playgroud)

对于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" ) );
  }
Run Code Online (Sandbox Code Playgroud)


小智 5

要清除屏幕,您首先需要包含一个模块:

#include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)

这将导入 Windows 命令。然后您可以使用“系统”功能运行批处理命令(编辑控制台)。在 C++ 的 Windows 上,清除屏幕的命令是:

system("CLS");
Run Code Online (Sandbox Code Playgroud)

这将清除控制台。整个代码如下所示:

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

using namespace std;

int main()
{
system("CLS");
}
Run Code Online (Sandbox Code Playgroud)

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

  • 那不是“模块”。C++ 没有“模块”。此外,`stdlib.h` 是由 C 标准指定的,与“导入 Windows 命令”无关,也与 Windows 本身无关。除了那些吹毛求疵之外,你很好。 (4认同)
  • system("cls") 不是这个问题的便携式解决方案,但它确实适用于 Windows 系统。 (3认同)

小智 5

// #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;
}
Run Code Online (Sandbox Code Playgroud)