Bagaimana saya bisa menghapus konsol


93

Seperti pada judulnya. Bagaimana cara menghapus konsol di C ++?


Di OS apa? Ini sedikit berbeda di Linux vs. Windows, hanya untuk satu contoh. Jika Anda menginginkannya untuk Windows, lihat: stackoverflow.com/questions/5866529/…
Jerry Coffin

Apakah Anda mencoba untuk mencetak banyak garis dan kemudian menghapusnya, atau menghapusnya setelah setiap baris?
jpm

1
Saya terkadang ingin mengatur ulang tampilan konsol. Saya tidak ingin konsol spam dengan jutaan baris baru.
Thomas B

Saya bertanya bagaimana melakukan ini di C, menggunakan pegangan jendela konsol. Inilah jawaban yang saya terima. Semoga dapat membantu kasus Anda.
Agi Hammerthief

Jawaban:


72

Untuk C ++ murni

Tidak boleh. C ++ bahkan tidak memiliki konsep konsol.

Program ini dapat mencetak ke printer, mengeluarkan langsung ke file, atau dialihkan ke input program lain untuk semua itu. Bahkan jika Anda dapat menghapus konsol di C ++, itu akan membuat kasus tersebut jauh lebih berantakan.

Lihat entri ini di FAQ comp.lang.c ++:

Khusus OS

Jika masih masuk akal untuk menghapus konsol dalam program Anda, dan Anda tertarik dengan solusi khusus sistem operasi, solusi tersebut memang ada.

Untuk Windows (seperti pada tag Anda), lihat tautan ini:

Sunting: Jawaban ini disebutkan sebelumnya menggunakan system("cls");, karena Microsoft mengatakan untuk melakukan itu. Namun telah ditunjukkan dalam komentar bahwa ini bukanlah hal yang aman untuk dilakukan . Saya telah menghapus tautan ke artikel Microsoft karena masalah ini.

Perpustakaan (agak portabel)

ncurses adalah pustaka yang mendukung manipulasi konsol:


6
@Alf: Saya menyalinnya dari artikel MS, jadi downvote mereka, bukan saya;) Saya akan memperbaikinya.
Merlyn Morgan-Graham

11
asal tidak masalah - kode yang bahkan tidak dapat dikompilasi (dengan g ++) tidak baik. Tapi karena Anda memperbaikinya, saya menghapus suara negatif. :-)
Salam dan hth. - Alf

1
@YoushaAleayoub mengedit jawaban untuk menghapus tautan MS yang menyarankan untuk digunakan system, dan menambahkan tautan ke artikel Anda yang menjelaskan alasannya.
Merlyn Morgan-Graham

53

Untuk Windows, melalui 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);
}

Ini dengan senang hati mengabaikan semua kemungkinan kesalahan, tapi hei, ini membersihkan konsol. Tidak seperti system("cls")menangani kesalahan dengan lebih baik.

Untuk * nix, Anda biasanya dapat menggunakan kode escape ANSI, jadi itu adalah:

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

Menggunakan systemuntuk ini hanya jelek.


6
"Menggunakan sistem untuk ini jelek sekali." - Kenapa? Tentu terlihat lebih bersih bagi saya :)
Merlyn Morgan-Graham

17
@ MerlynMorgan-Graham: Ini memunculkan proses shell untuk membersihkan konsol sialan. Dalam hal apakah itu solusi yang bersih? : P Ini seperti menggunakan echovia system()alih-alih menulis ke stdout.
Cat Plus Plus

1
Satu kapal FTW! ;) Ya, saya sedang bercanda. Fakta bahwa itu memunculkan proses shell adalah info yang bagus untuk jawaban Anda. 1 untuk versi * nix.
Merlyn Morgan-Graham

8
Menggunakan system()adalah kesalahan umum. Jadi, juga, adalah metode yang Anda sarankan untuk Unices. Inilah yang harus dilakukan pada sistem POSIX. Anda mendapatkan bagian Win32 dengan benar, meskipun Anda tidak memasukkan konvensi "gulir kembali".
JdeBP


20

Untuk Linux / Unix dan mungkin beberapa yang lain tetapi tidak untuk Windows sebelum 10 TH2:

printf("\033c");

akan mengatur ulang terminal.


15

Cara termudah bagi saya tanpa harus menemukan kembali roda.

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

Tidak bekerja untuk saya: mencetakTERM environment variable not set.
secavfr

8

mengeluarkan beberapa baris ke konsol jendela tidak berguna..itu hanya menambahkan baris kosong ke sana. Sayangnya, caranya adalah khusus windows dan melibatkan conio.h (dan clrscr () mungkin tidak ada, itu juga bukan header standar) atau metode 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 );
  }

Untuk sistem POSIX ini jauh lebih sederhana, Anda dapat menggunakan ncurses atau fungsi terminal

#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

Untuk membersihkan layar, Anda perlu memasukkan modul terlebih dahulu:

#include <stdlib.h>

ini akan mengimpor perintah windows. Kemudian Anda dapat menggunakan fungsi 'sistem' untuk menjalankan perintah Batch (yang mengedit konsol). Pada Windows di C ++, perintah untuk membersihkan layar adalah:

system("CLS");

Dan itu akan menghapus konsol. Seluruh kode akan terlihat seperti ini:

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

using namespace std;

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

Dan hanya itu yang Anda butuhkan! Semoga berhasil :)


3
system ("cls") bukanlah solusi portabel untuk masalah ini, namun berfungsi pada sistem Windows.
CMS_95

4
Itu bukan "modul". C ++ tidak memiliki "modul". Lebih jauh, stdlib.hditentukan oleh standar C, dan tidak ada hubungannya dengan "mengimpor perintah windows" atau memang Windows itu sendiri. Selain itu, Anda baik-baik saja.
Balapan Ringan di Orbit

3

Di Windows:

#include <cstdlib>

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

Di Linux / Unix:

#include <cstdlib>

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

3

Ini sulit dilakukan pada MAC karena tidak memiliki akses ke fungsi windows yang dapat membantu membersihkan layar. Perbaikan terbaik saya adalah mengulang dan menambahkan baris sampai terminal bersih dan kemudian menjalankan program. Namun ini tidak seefisien atau ramah memori jika Anda menggunakan ini terutama dan sering.

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

2

Gunakan system("cls")untuk membersihkan layar:

#include <stdlib.h>

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

2
Sudah disebutkan dalam jawaban yang diterima. Tidak ada informasi baru di sini.
Dialecticus

Kemudian singkirkan cout / wcout dan cukup masukkan hal-hal ke sistem ("echo" + output Anda);
Tanveer Badar

2

Di Windows kami memiliki beberapa opsi:

  1. clrscr () (File Header: conio.h)

  2. system ("cls") (File Header: stdlib.h)

Di Linux, gunakan system ("clear") (File Header: stdlib.h)


Perhatikan bahwa panggilan apa pun ke sistem () bisa menjadi masalah keamanan.
John Doe

0

Berikut cara sederhana untuk melakukannya:

#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

}

Panggil saja cls () di mana saja


Ini bukanlah yang dicari OP. Baca komentar yang ditambahkan ke pertanyaan.
Agi Hammerthief

-2

Anda dapat menggunakan metode konsol jelas sistem operasi melalui system ("");
untuk windows itu akan menjadi system ("cls"); misalnya
dan bukannya merilis tiga kode berbeda untuk sistem operasi yang berbeda. buat saja metode untuk mendapatkan os apa yang sedang berjalan.
Anda dapat melakukan ini dengan mendeteksi apakah ada variabel sistem unik dengan #ifdef
mis

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

edit: pertanyaan ulang sepenuhnya

Cukup uji sistem tempat mereka berada dan kirim perintah sistem tergantung pada sistem. meskipun ini akan disetel pada waktu kompilasi

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

Ini adalah metode yang benar-benar baru!


3
Cara yang sangat buruk untuk melakukannya. Plus itu tidak membersihkan konsol, itu hanya menambahkan baris kosong. Tidak akan membantu.
Wisnu Narang

Untuk menambahkan penghinaan ke cedera, coutmungkin telah dialihkan ke file. Maka tidak ada konsep konsol sama sekali.
Tanveer Badar

-3

gunakan: clrscr ();

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

3
"Dulu adalah fungsi dalam <conio.h>, di kompiler Borland C lama. Ini bukan fungsi standar C ++." stackoverflow.com/a/930141/1058115
cojack

-7

Cara termudah adalah dengan menyiram streaming beberapa kali (idealnya lebih besar dari konsol yang mungkin) 1024 * 1024 kemungkinan adalah ukuran yang tidak pernah dimiliki jendela konsol.

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

  return 0;
}

Satu-satunya masalah dengan ini adalah kursor perangkat lunak; Benda yang berkedip (atau benda yang tidak berkedip) tergantung pada platform / konsol akan berada di ujung konsol, berlawanan dengan bagian atasnya. Namun semoga ini tidak menimbulkan masalah.


2
Jawaban ini adalah kesalahan umum .
JdeBP
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.