我该如何清除控制台

时间:2011-06-26 19:45:36

标签: c++ windows console-application dev-c++

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

21 个答案:

答案 0 :(得分:62)

对于纯C ++

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

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

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

<强>与操作系统相关的

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

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

编辑:此答案之前提到使用system("cls");,因为微软说这样做。但是,this is not a safe thing to do的评论中已经指出了这一点。由于此问题,我已删除了Microsoft文章的链接。

图书馆(有点便携)

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

答案 1 :(得分:46)

对于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);
}

它高兴地忽略了所有可能的错误,但是,嘿,它是控制台清除。不像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这只是丑陋。

答案 2 :(得分:15)

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

printf("\033c");

将重置终端。

答案 3 :(得分:6)

输出多行到窗口控制台是没用的..只是添加空行。 遗憾的是,方式是特定于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" ) );
  }

答案 4 :(得分:4)

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

答案 5 :(得分:3)

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

#include <stdlib.h>

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

答案 6 :(得分:3)

这真的很不稳定,但请尝试:

void cls() {
    for (int i = 0; i < 250; ++i) {
        std::cout << endl;
    }
}

答案 7 :(得分:3)

在Windows中:

#include <cstdlib>

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

在Linux / Unix中:

#include <cstdlib>

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

答案 8 :(得分:3)

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

#include <stdlib.h>

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

system("CLS");

这将清除控制台。整个代码看起来像这样:

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

using namespace std;

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

这就是你所需要的!古德勒克:)

答案 9 :(得分:2)

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

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

答案 10 :(得分:1)

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

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

答案 11 :(得分:0)

这是一种简单的方法:

#include <iostream>

using namespace std;

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

答案 12 :(得分:0)

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

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

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

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

答案 13 :(得分:0)

如果您使用的是 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");无需创建流程即可完成。

答案 14 :(得分:-1)

使用System :: Console :: Clear();

这将清除(清空)缓冲区

答案 15 :(得分:-1)

#include <cstdlib>

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

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

}

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

答案 16 :(得分:-1)

#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"); 行。

答案 17 :(得分:-2)

编辑:完全重做问题

只需测试它们所在的系统并根据系统发送系统命令。虽然这将在编译时设置

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

这是一种全新的方法!

答案 18 :(得分:-2)

您可以通过系统(“”)使用操作系统的清除控制台方法;
对于Windows,它将是系统(“cls”);例如
而不是为不同的操作系统发布三个不同的代码。只需创建一个方法来获取正在运行的操作系统。 你可以通过检测#ifdef是否存在唯一的系统变量来做到这一点
e.g。

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

}

答案 19 :(得分:-3)

使用:clrscr();

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

答案 20 :(得分:-7)

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

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

  return 0;
}

唯一的问题是软件光标;闪烁的东西(或非闪烁的东西)取决于平台/控制台将在控制台的末端,而不是它的顶部。然而,这绝不会导致任何麻烦。