【问题标题】:How can I clear console如何清除控制台
【发布时间】:2021-12-10 12:11:49
【问题描述】:

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

【问题讨论】:

  • 在什么操作系统上? Linux 与 Windows 上的情况有很大不同,仅举一个例子。如果你想要它用于 Windows,请参阅:stackoverflow.com/questions/5866529/…
  • 你是打印一堆行然后清空,还是每行清空?
  • 有时我想重置控制台视图。我不想用数以百万计的换行符向控制台发送垃圾邮件。
  • 我在 C 语言中使用控制台窗口句柄询问了 how to do thisThis is the answer 我收到了。希望它对您的情况有所帮助。

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


【解决方案1】:

对于纯 C++

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

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

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

操作系统特定

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

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

编辑:这个答案之前提到过使用system("cls");,因为微软说过要这样做。然而,在 cmets 中已经指出 this is not a safe thing to do。由于这个问题,我删除了指向 Microsoft 文章的链接。

库(有点便携)

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

【讨论】:

  • @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 实在是太丑了。

【讨论】:

【解决方案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】:

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

      #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 本身无关。除了挑剔之外,你很好。
      【解决方案7】:
      // #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;
      }
      

      【讨论】:

        【解决方案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 中,我们有多种选择:

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

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

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

            【讨论】:

            • 请注意,任何对 system() 的调用都可能是一个安全问题。
            【解决方案12】:

            效果很好:

            #include <windows.h>
            
            void clearscreen()
            {
                HANDLE hOut;
                COORD Position;
            
                hOut = GetStdHandle(STD_OUTPUT_HANDLE);
            
                Position.X = 0;
                Position.Y = 0;
                SetConsoleCursorPosition(hOut, Position);
            }
            

            【讨论】:

              【解决方案13】:

              这是一个简单的方法:

              #include <iostream>
              
              using namespace std;
              
              int main()
              {
                  cout.flush(); // Flush the output stream
                  system("clear"); // Clear the console with the "system" function
              }
              

              【讨论】:

                【解决方案14】:

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

                【讨论】:

                  【解决方案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;
                        }
                  

                  【讨论】:

                  【解决方案19】:

                  最简单的方法是多次刷新流(最好比任何可能的控制台都大)1024*1024 可能是任何控制台窗口都无法达到的大小。

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

                  唯一的问题是软件光标;取决于平台/控制台的闪烁的东西(或不闪烁的东西)将位于控制台的末端,而不是它的顶部。但是,希望这绝不会引起任何麻烦。

                  【讨论】:

                  猜你喜欢
                  • 2011-02-28
                  相关资源
                  最近更新 更多