如何清除控制台


92

如标题中所示。如何清除C ++中的控制台?


在什么操作系统上?仅举一个例子,在Linux和Windows上有很大的不同。如果你想让它适用于Windows,请参阅:stackoverflow.com/questions/5866529/...
杰里棺材

您是要打印一堆线然后清除它,还是在每行之后清除它?
摩根大通

1
我有时想重置控制台视图。我不想用数百万个换行符来发送垃圾邮件。
Thomas B

我问如何使用控制台窗口句柄在C中执行此操作这是我收到的答案。希望它对您的情况有所帮助。
Agi Hammerthief

Answers:


71

对于纯C ++

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

该程序可以将其打印到打印机,直接输出到文件或重定向到另一个程序的输入(无论它关心什么)。即使您可以清除C ++中的控制台,也会使这些情况更加混乱。

请参阅comp.lang.c ++常见问题解答中的此项:

特定于操作系统

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

对于Windows(如标签中所示),请查看以下链接:

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

图书馆(有点可移植)

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


6
@Alf:我从MS文章中复制并粘贴了该内容,因此请对其进行投票,而不是对我进行投票;)我会进行修复。
Merlyn Morgan-Graham

11
来源无关紧要-甚至无法编译(使用g ++)的代码也是不好的。但自从您解决了问题,我就删除了downvote。:-)
干杯和hth。-Alf

1
@YoushaAleayoub编辑了答案,删除了建议使用的MS链接system,并在您的文章中添加了一个解释原因的链接。
Merlyn Morgan-Graham

52

对于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为此使用是丑陋的。


6
“为此使用系统是丑陋的。” -为什么?当然对我来说看起来更干净:)
Merlyn Morgan-Graham

16
@ MerlynMorgan-Graham:它产生一个shell进程来清除一个friggin的控制台。这是什么干净的解决方案?:P就像使用echoviasystem()而不是写入stdout一样。
Cat Plus Plus

1
一只班轮FTW!;)是的,我正在开玩笑。它产生一个shell进程的事实对于您的回答是个很好的信息。* nix版本为+1。
Merlyn Morgan-Graham



20

对于Linux / Unix,也许还有其他一些,但不适用于Windows 10 TH2之前的Windows:

printf("\033c");

将重置终端。


13

对我而言,最简单的方法是无需重新发明轮子。

void Clear()
{
#if defined _WIN32
    system("cls");
#elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
    system("clear");
#elif defined (__APPLE__)
    system("clear");
#endif
}

8

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

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;
}

3

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

#include <stdlib.h>

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

system("CLS");

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

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

using namespace std;

int main()
{
system("CLS");
}

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


3
system(“ cls”)不是此问题的可移植解决方案,但是它在Windows系统上确实有效。
CMS_95

4
那不是一个“模块”。C ++没有“模块”。此外,它stdlib.h是由C标准指定的,与“导入Windows命令”或Windows本身无关。除了挑剔,你还好。
Lightness Races in Orbit

3

在Windows中:

#include <cstdlib>

int main() { 
    std::system("cls");
    return 0;
}

在Linux / Unix中:

#include <cstdlib>

int main() { 
    std::system("clear");
    return 0;
}

2

使用system("cls")清除屏幕:

#include <stdlib.h>

int main(void)
{
    system("cls");
    return 0;
}

2
已在接受的答案中提及。这里没有新信息。
Dialecticus

然后摆脱cout / wcout并简单地将内容通过管道传递给system(“ echo” +您的输出);
Tanveer Badar

2

在MAC上很难做到这一点,因为它无法访问可帮助清除屏幕的Windows功能。我最好的解决方法是循环并添加行,直到清除终端,然后运行程序。但是,如果您主要且经常使用它,那么效率或内存友好性就不那么高。

void clearScreen(){
    int clear = 5;
    do {
        cout << endl;
        clear -= 1;
    } while (clear !=0);
}

2

在Windows中,我们有多种选择:

  1. clrscr()(头文件:conio.h)

  2. system(“ cls”)(头文件:stdlib.h)

在Linux中,使用system(“ clear”)(头文件:stdlib.h)


请注意,任何对system()的调用都可能是安全问题。
John Doe

0

这是一种简单的方法:

#include <iostream>

using namespace std;

int main()
{
    cout.flush(); // Flush the output stream
    system("clear"); // Clear the console with the "system" function
}


-1
#include <cstdlib>

void cls(){
#if defined(_WIN32) //if windows
    system("cls");

#else
    system("clear");    //if other
#endif  //finish

}

只需在任何地方调用cls()


这不是OP想要的。阅读添加到问题的评论。
Agi Hammerthief

-2

您可以通过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

}

-2

编辑:完全重做问题

只需测试它们在哪个系统上,然后根据系统发送系统命令即可。尽管这将在编译时设置

#ifdef __WIN32
    system("cls");
#else
    system("clear"); // most other systems use this
#endif

这是一种全新的方法!


3
一种非常非常糟糕的方法。另外,它不会清除控制台,只是添加空白行。不会帮助。
Vishnu Narang

为了增加侮辱性伤害,cout可能已将其重定向到文件。然后根本没有控制台的概念。
Tanveer Badar

-3

使用:clrscr();

#include <iostream>
using namespace std;
int main()
      {           
         clrscr();
         cout << "Hello World!" << endl;
         return 0;
      }

3
“它曾经是旧的Borland C编译器中<conio.h>中的函数。它不是C ++标准函数。” stackoverflow.com/a/930141/1058115
cojack

-7

最简单的方法是多次刷新流(理想情况下,刷新大于任何可能的控制台)1024 * 1024的大小可能是没有控制台窗口的大小。

int main(int argc, char *argv)
{
  for(int i = 0; i <1024*1024; i++)
      std::cout << ' ' << std::endl;

  return 0;
}

唯一的问题是软件游标。取决于平台/控制台的闪烁物(或非闪烁物)将位于控制台的末尾,而不是其顶部。但是,这绝不希望引起任何麻烦。


2
这个答案是一个普遍的错误
JdeBP 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.