Làm cách nào để xóa bảng điều khiển


92

Như trong tiêu đề. Làm cách nào để xóa bảng điều khiển trong C ++?


Trên hệ điều hành nào? Nó hơi khác một chút trên Linux và Windows, chỉ là một ví dụ. Nếu bạn muốn nó cho Windows, hãy xem: stackoverflow.com/questions/5866529/…
Jerry Coffin

Bạn đang cố gắng in một loạt các dòng và sau đó xóa nó, hoặc xóa nó sau mỗi dòng?
jpm

1
Đôi khi tôi muốn đặt lại chế độ xem bảng điều khiển. Tôi không muốn spam bảng điều khiển với hàng triệu dòng mới.
Thomas B

Tôi đã hỏi cách thực hiện việc này trong C, bằng cách sử dụng một tay cầm cửa sổ bảng điều khiển. Đây là câu trả lời mà tôi nhận được. Hy vọng rằng nó giúp ích cho trường hợp của bạn.
Agi Hammerthief

Câu trả lời:


71

Đối với C ++ thuần túy

Bạn không thể. C ++ thậm chí không có khái niệm về giao diện điều khiển.

Chương trình có thể được in ra máy in, xuất thẳng ra tệp hoặc được chuyển hướng đến đầu vào của chương trình khác cho tất cả những gì nó quan tâm. Ngay cả khi bạn có thể xóa bảng điều khiển bằng C ++, nó sẽ khiến những trường hợp đó trở nên lộn xộn hơn đáng kể.

Xem mục này trong Câu hỏi thường gặp về comp.lang.c ++:

Hệ điều hành cụ thể

Nếu vẫn có ý nghĩa khi xóa bảng điều khiển trong chương trình của bạn và bạn quan tâm đến các giải pháp cụ thể của hệ điều hành, thì chúng vẫn tồn tại.

Đối với Windows (như trong thẻ của bạn), hãy xem liên kết này:

Chỉnh sửa: Câu trả lời này trước đây đã đề cập đến việc sử dụng system("cls");, bởi vì Microsoft cho biết làm điều đó. Tuy nhiên, nó đã được chỉ ra trong các bình luận rằng đây không phải là một điều an toàn để làm . Tôi đã xóa liên kết đến bài viết của Microsoft vì sự cố này.

Thư viện (hơi di động)

ncurses là một thư viện hỗ trợ thao tác trên bảng điều khiển:


6
@Alf: Tôi sao chép đã dán nó từ bài báo của MS, vì vậy hãy phản đối họ, không phải tôi;) Tôi sẽ sửa nó.
Merlyn Morgan-Graham

11
nguồn gốc không quan trọng - mã thậm chí sẽ không biên dịch (với g ++) là không tốt. Nhưng vì bạn đã sửa nó nên tôi đã gỡ bỏ phiếu xuống. :-)
Chúc mừng và hth. - Alf

1
@YoushaAleayoub đã chỉnh sửa câu trả lời để xóa liên kết MS đề xuất sử dụng systemvà thêm liên kết vào bài viết của bạn giải thích lý do.
Merlyn Morgan-Graham

53

Đối với Windows, thông qua API Console:

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

Nó vui vẻ bỏ qua tất cả các lỗi có thể xảy ra, nhưng này, nó đang xóa bảng điều khiển. Không giống như system("cls")xử lý lỗi tốt hơn.

Đối với * nixes, bạn thường có thể sử dụng mã thoát ANSI, vì vậy nó sẽ là:

void clear() {
    // CSI[2J clears screen, CSI[H moves the cursor to top-left corner
    std::cout << "\x1B[2J\x1B[H";
}

Sử dụng systemcho điều này chỉ là xấu xí.


6
"Sử dụng hệ thống cho điều này chỉ là xấu xí." - Tại sao? Chắc chắn trông sạch hơn với tôi :)
Merlyn Morgan-Graham

17
@ MerlynMorgan-Graham: Nó tạo ra một quy trình shell để xóa một bảng điều khiển quái vật. Theo cách nào thì đó là một giải pháp sạch? : P Nó giống như sử dụng echoqua system()thay vì viết vào stdout.
Cat Plus Plus

1
Một lớp lót FTW! ;) Vâng, tôi đang phải đối mặt. Thực tế là nó tạo ra một quá trình shell là thông tin tốt cho câu trả lời của bạn, tho. +1 cho phiên bản * nix.
Merlyn Morgan-Graham


1
Không cần lưu trữ. jdebp.eu./FGA/clearing-the-tui-screen.html#CLS tồn tại.
JdeBP

20

Đối với Linux / Unix và có thể một số khác nhưng không dành cho Windows trước 10 TH2:

printf("\033c");

sẽ thiết lập lại thiết bị đầu cuối.


14

Cách dễ nhất cho tôi mà không cần phải phát minh lại bánh xe.

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

8

xuất nhiều dòng ra bảng điều khiển cửa sổ là vô ích..nó chỉ thêm các dòng trống vào đó. thật đáng buồn, cách dành riêng cho từng cửa sổ và liên quan đến conio.h (và clrscr () có thể không tồn tại, đó cũng không phải là tiêu đề chuẩn) hoặc phương thức 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 );
  }

Đối với hệ thống POSIX thì đơn giản hơn, bạn có thể sử dụng ncurses hoặc các hàm đầu cuối

#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

Để xóa màn hình, trước tiên bạn sẽ cần bao gồm một mô-đun:

#include <stdlib.h>

điều này sẽ nhập các lệnh cửa sổ. Sau đó, bạn có thể sử dụng chức năng 'hệ thống' để chạy các lệnh Batch (chỉnh sửa bảng điều khiển). Trên Windows bằng C ++, lệnh xóa màn hình sẽ là:

system("CLS");

Và điều đó sẽ xóa bảng điều khiển. Toàn bộ mã sẽ như thế này:

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

using namespace std;

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

Và đó là tất cả những gì bạn cần! Chúc may mắn :)


3
system ("cls") không phải là giải pháp di động cho vấn đề này, tuy nhiên nó hoạt động trên hệ thống Windows.
CMS_95

4
Đó không phải là một "mô-đun". C ++ không có "mô-đun". Hơn nữa, stdlib.hđược chỉ định bởi tiêu chuẩn C, và không liên quan gì đến "nhập lệnh cửa sổ" cũng như thực sự là chính Windows. Ngoại trừ cái nitpicking đó, bạn vẫn ổn.
Lightness Races in Orbit

3

Trong Windows:

#include <cstdlib>

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

Trong Linux / Unix:

#include <cstdlib>

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

2

Sử dụng system("cls")để xóa màn hình:

#include <stdlib.h>

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

2
Đã được đề cập trong câu trả lời được chấp nhận. Không có thông tin mới ở đây.
Dialecticus

Sau đó, loại bỏ cout / wcout và chỉ cần chuyển nội dung vào hệ thống ("echo" + đầu ra của bạn);
Tanveer Badar

2

Điều này khó thực hiện trên MAC vì nó không có quyền truy cập vào các chức năng cửa sổ có thể giúp xóa màn hình. Cách khắc phục tốt nhất của tôi là lặp lại và thêm dòng cho đến khi thiết bị đầu cuối rõ ràng và sau đó chạy chương trình. Tuy nhiên, điều này không hiệu quả hoặc thân thiện với bộ nhớ nếu bạn sử dụng nó chủ yếu và thường xuyên.

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

2

Trong Windows, chúng tôi có nhiều tùy chọn:

  1. clrscr () (Tệp Tiêu đề: conio.h)

  2. system ("cls") (Tệp Tiêu đề: stdlib.h)

Trong Linux, sử dụng hệ thống ("clear") (Tệp Tiêu đề: stdlib.h)


Lưu ý rằng bất kỳ cuộc gọi nào đến hệ thống () đều có thể là vấn đề bảo mật.
John Doe

0

Đây là một cách đơn giản để làm điều đó:

#include <iostream>

using namespace std;

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

-1

Sử dụng Hệ thống :: Console :: Clear ();

Điều này sẽ xóa (trống) bộ đệm


3
[Lỗi] 'Hệ thống' chưa được khai báo.
LoveToCode

6
Điều này dành cho c ++ / CLI (hay còn gọi là .NET c ++)
FryGuy

-1
#include <cstdlib>

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

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

}

Chỉ gọi cls () ở bất cứ đâu


Đây không phải là những gì OP đang tìm kiếm. Đọc bình luận được thêm vào câu hỏi.
Agi Hammerthief

-2

Bạn có thể sử dụng phương thức bảng điều khiển rõ ràng của hệ điều hành thông qua system ("");
đối với windows nó sẽ là system ("cls"); ví dụ
và thay vì phát hành ba mã khác nhau cho các hệ điều hành khác nhau. chỉ cần tạo một phương thức để lấy những gì hệ điều hành đang chạy.
bạn có thể làm điều này bằng cách phát hiện nếu các biến hệ thống duy nhất tồn tại với #ifdef,
ví dụ:

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

chỉnh sửa: hoàn toàn làm lại câu hỏi

Đơn giản chỉ cần kiểm tra hệ thống họ đang sử dụng và gửi lệnh hệ thống tùy thuộc vào hệ thống. mặc dù điều này sẽ được đặt tại thời điểm biên dịch

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

Đây là một phương pháp hoàn toàn mới!


3
Một cách rất tệ để làm điều đó. Thêm vào đó, nó không xóa bảng điều khiển, nó chỉ thêm các dòng trống. Sẽ không giúp được gì.
Vishnu Narang

Để thêm sự xúc phạm đến thương tích, coutcó thể đã được chuyển hướng đến một tệp. Sau đó, không có khái niệm về một bảng điều khiển nào cả.
Tanveer Badar

-3

sử dụng: clrscr ();

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

3
"Nó từng là một hàm trong <conio.h>, trong các trình biên dịch Borland C cũ. Nó không phải là một hàm chuẩn C ++." stackoverflow.com/a/930141/1058115
cojack

-7

Cách dễ nhất là xả luồng nhiều lần (lý tưởng là lớn hơn bất kỳ bảng điều khiển nào có thể) 1024 * 1024 có thể là một kích thước mà không một cửa sổ bảng điều khiển nào có được.

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

  return 0;
}

Vấn đề duy nhất với điều này là con trỏ phần mềm; thứ nhấp nháy đó (hoặc thứ không nhấp nháy) tùy thuộc vào nền tảng / bảng điều khiển sẽ nằm ở cuối bảng điều khiển, trái ngược với phần trên cùng của nó. Tuy nhiên, điều này hy vọng sẽ không bao giờ gây ra bất kỳ rắc rối nào.


2
Câu trả lời này là một sai lầm phổ biến .
JdeBP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.