ฉันจะล้างคอนโซลได้อย่างไร


93

ตามชื่อเรื่อง. ฉันจะล้างคอนโซลใน C ++ ได้อย่างไร


บน OS อะไร? มันค่อนข้างแตกต่างกันเล็กน้อยใน Linux กับ Windows เพียงตัวอย่างเดียว หากคุณต้องการสำหรับ Windows โปรดดู: stackoverflow.com/questions/5866529/…
Jerry Coffin

คุณกำลังพยายามพิมพ์กลุ่มบรรทัดแล้วล้างหรือล้างมันหลังจากแต่ละบรรทัด?
jpm

1
บางครั้งฉันต้องการรีเซ็ตมุมมองคอนโซล ฉันไม่ต้องการสแปมคอนโซลที่มีบรรทัดใหม่นับล้าน
Thomas B

ฉันถามวิธีทำใน C โดยใช้ที่จับหน้าต่างคอนโซล นี่คือคำตอบที่ฉันได้รับ หวังว่าจะช่วยในกรณีของคุณได้
Agi Hammerthief

คำตอบ:


72

สำหรับ C ++ บริสุทธิ์

คุณทำไม่ได้ C ++ ไม่มีแนวคิดของคอนโซล

โปรแกรมสามารถพิมพ์ไปยังเครื่องพิมพ์ส่งออกไปยังไฟล์โดยตรงหรือถูกเปลี่ยนเส้นทางไปยังอินพุตของโปรแกรมอื่นสำหรับทุกสิ่งที่ใส่ใจ แม้ว่าคุณจะสามารถล้างคอนโซลใน C ++ ได้ แต่ก็จะทำให้กรณีเหล่านั้นยุ่งมากขึ้น

ดูรายการนี้ในคำถามที่พบบ่อยของ comp.lang.c ++:

เฉพาะระบบปฏิบัติการ

หากยังคงเหมาะสมที่จะล้างคอนโซลในโปรแกรมของคุณและคุณสนใจในโซลูชันเฉพาะของระบบปฏิบัติการสิ่งเหล่านี้ก็มีอยู่จริง

สำหรับ Windows (ในแท็กของคุณ) โปรดดูที่ลิงค์นี้:

แก้ไข: คำตอบนี้กล่าวถึงก่อนหน้านี้โดยใช้system("cls");เนื่องจาก Microsoft บอกว่าจะทำเช่นนั้น แต่จะได้รับการชี้ให้เห็นในความคิดเห็นที่นี้ไม่ได้เป็นสิ่งที่ปลอดภัยที่จะทำ ฉันได้ลบลิงก์ไปยังบทความของ Microsoft เนื่องจากปัญหานี้

ห้องสมุด (พกพาได้บ้าง)

ncurses เป็นไลบรารีที่รองรับการจัดการคอนโซล:


6
@ อัลฟ์: ฉันคัดลอกมาจากบทความ MS ดังนั้นให้ลดคะแนนลงไม่ใช่ฉัน;) ฉันจะแก้ไขมัน
Merlyn Morgan-Graham

11
ต้นกำเนิดไม่สำคัญ - โค้ดที่ไม่สามารถคอมไพล์ได้ (ด้วย g ++) นั้นไม่ดี แต่เนื่องจากคุณแก้ไขแล้วฉันจึงลบการโหวตลง :-)
ไชโยและ hth - Alf

1
@YoushaAleayoub แก้ไขคำตอบเพื่อลบลิงก์ MS ที่แนะนำให้ใช้systemและเพิ่มลิงก์ไปยังบทความของคุณเพื่ออธิบายสาเหตุ
Merlyn Morgan-Graham

53

สำหรับ 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สำหรับสิ่งนี้น่าเกลียด


6
"การใช้ระบบเพื่อสิ่งนี้น่าเกลียด" - ทำไม? แน่นอนว่าดูสะอาดกว่าสำหรับฉัน :)
Merlyn Morgan-Graham

17
@ MerlynMorgan-Graham: มันสร้างกระบวนการเชลล์เพื่อล้างคอนโซลของ friggin วิธีการแก้ปัญหาที่สะอาดคืออะไร? : P มันเหมือนกับการใช้echovia system()แทนการเขียนถึง stdout
Cat Plus Plus

1
FTW ซับเดียว! ;) ใช่ฉันเป็นคนฉลาด ความจริงที่ว่ามันเกิดกระบวนการเชลล์เป็นข้อมูลที่ดีสำหรับคำตอบของคุณ +1 สำหรับเวอร์ชัน * nix
Merlyn Morgan-Graham


1
ไม่จำเป็นต้องมีหอจดหมายเหตุ jdebp.eu./FGA/clearing-the-tui-screen.html#CLSอยู่
JdeBP

20

สำหรับ Linux / Unix และอาจมีบางรุ่น แต่ไม่ใช่สำหรับ Windows ก่อน 10 TH2:

printf("\033c");

จะรีเซ็ตเทอร์มินัล


15

วิธีที่ง่ายที่สุดสำหรับฉันโดยไม่ต้องสร้างล้อใหม่

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ฟังก์ชั่นที่จะหลีกเลี่ยงการใช้งานของระบบ funtion
#include <conio.h>
clrscr();
  • บนLinuxคุณสามารถใช้ลำดับ ANSI Escape เพื่อหลีกเลี่ยงการใช้ฟังก์ชันระบบ ตรวจสอบการอ้างอิงนี้ANSI Escape Sequences
    std::cout<< u8"\033[2J\033[1;1H"; 
  • ในการ ตรวจสอบMacOS ...

ไม่ได้ผลสำหรับฉัน: การพิมพ์TERM environment variable not set.
secavfr

@secavfr ตรวจสอบการอัปเดต
Joma

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 จากนั้นคุณสามารถใช้ฟังก์ชัน 'system' เพื่อเรียกใช้คำสั่ง Batch (ซึ่งแก้ไขคอนโซล) บน 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 ใน Orbit

3

ใน Windows:

#include <cstdlib>

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

ใน Linux / Unix:

#include <cstdlib>

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

3

นี่เป็นเรื่องยากสำหรับการทำบน MAC เนื่องจากไม่มีการเข้าถึงฟังก์ชัน windows ที่สามารถช่วยล้างหน้าจอได้ การแก้ไขที่ดีที่สุดของฉันคือการวนซ้ำและเพิ่มบรรทัดจนกว่าเทอร์มินัลจะชัดเจนจากนั้นเรียกใช้โปรแกรม อย่างไรก็ตามสิ่งนี้ไม่ได้มีประสิทธิภาพหรือเป็นมิตรกับหน่วยความจำหากคุณใช้สิ่งนี้เป็นหลักและบ่อยครั้ง

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

2

ใช้system("cls")เพื่อล้างหน้าจอ:

#include <stdlib.h>

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

2
ได้กล่าวไว้แล้วในคำตอบที่ยอมรับ ไม่มีข้อมูลใหม่ที่นี่
Dialecticus

จากนั้นกำจัด cout / wcout และเพียงแค่ต่อท่อเข้ากับระบบ ("echo" + เอาต์พุตของคุณ);
Tanveer Badar

2

ใน Windows เรามีหลายทางเลือก:

  1. clrscr () (ไฟล์ส่วนหัว: conio.h)

  2. ระบบ ("cls") (ไฟล์ส่วนหัว: stdlib.h)

ใน Linux ให้ใช้ system ("clear") (Header File: 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

ใช้ System :: Console :: Clear ();

สิ่งนี้จะล้าง (ว่าง) บัฟเฟอร์


3
[ข้อผิดพลาด] ไม่ได้รับการประกาศ "ระบบ"
LoveToCode

6
นี่สำหรับ c ++ / CLI (aka .NET c ++)
FryGuy

-1
#include <cstdlib>

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

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

}

เพียงแค่โทร cls () ได้ทุกที่


นี่ไม่ใช่สิ่งที่ OP กำลังมองหา อ่านความคิดเห็นที่เพิ่มเข้ามาในคำถาม
Agi Hammerthief

-2

คุณสามารถใช้วิธี clear console ของระบบปฏิบัติการผ่าน system ("");
สำหรับ windows มันจะเป็นระบบ ("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
วิธีที่แย่มากที่จะทำ นอกจากนี้ยังไม่ได้ล้างคอนโซล แต่เป็นการเพิ่มบรรทัดว่างเท่านั้น ไม่ไปช่วย.
วิษณุ ณ รังค์

หากต้องการเพิ่มการดูถูกการบาดเจ็บcoutอาจถูกเปลี่ยนเส้นทางไปยังไฟล์ จากนั้นก็ไม่มีแนวคิดเรื่องคอนโซลเลย
Tanveer Badar


-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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.