Konsolu nasıl temizleyebilirim


92

Başlıkta olduğu gibi. C ++ 'da konsolu nasıl temizleyebilirim?


Hangi işletim sisteminde? Sadece bir örnek için, Linux ve Windows'ta biraz farklıdır. Windows için istiyorsanız, bkz: stackoverflow.com/questions/5866529/…
Jerry Coffin

Bir dizi satırı yazdırıp sonra silmeye mi yoksa her satırdan sonra silmeye mi çalışıyorsunuz?
jpm

1
Bazen konsol görünümünü sıfırlamak istiyorum. Milyonlarca yeni satır içeren konsolda spam yapmak istemiyorum.
Thomas B

Bunu bir konsol pencere tutamacı kullanarak C'de nasıl yapacağımı sordum . Aldığım cevap bu. Umarım davanıza yardımcı olur.
Agi Hammerthief

Yanıtlar:


71

Saf C ++ için

Yapamazsın. C ++ konsol konseptine sahip bile değil.

Program, bir yazıcıya yazdırıyor, doğrudan bir dosyaya çıktı gönderiyor veya ilgilendiği her şey için başka bir programın girişine yeniden yönlendiriliyor olabilir. Konsolu C ++ 'da temizleseniz bile, bu durumları önemli ölçüde daha karmaşık hale getirir.

Comp.lang.c ++ SSS'de bu girişe bakın:

İşletim Sistemine Özgü

Programınızdaki konsolu temizlemek yine de mantıklıysa ve işletim sistemine özel çözümlerle ilgileniyorsanız, bunlar mevcuttur.

Windows için (etiketinizdeki gibi) şu bağlantıya bakın:

Düzenleme: Bu cevap daha önce kullanılarak bahsedildi system("cls");, çünkü Microsoft bunu yapmasını söyledi. Ancak yorumlarda bunun güvenli bir şey olmadığı belirtildi. . Bu sorun nedeniyle Microsoft makalesinin bağlantısını kaldırdım.

Kitaplıklar (biraz taşınabilir)

ncurses, konsol işlemeyi destekleyen bir kitaplıktır:


6
@Alf: Bunu MS makalesinden kopyaladım, bu yüzden onları aşağı oyla, ben değil;) Yine de düzelteceğim.
Merlyn Morgan-Graham

11
köken önemli değildir - derlenmeyen kod (g ++ ile) iyi değildir. Ama sen onu düzelttiğinden beri olumsuz oyu kaldırdım. :-)
Şerefe ve hth. - Alf

1
@YoushaAleayoub, kullanmayı öneren MS bağlantısını kaldırmak için yanıtı düzenledi ve systemmakalenize nedenini açıklayan bir bağlantı ekledi.
Merlyn Morgan-Graham

53

Windows için, Konsol API aracılığıyla:

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

Olası tüm hataları mutlu bir şekilde görmezden gelir, ancak hey, bu konsol temizliği. Değil gibi system("cls")daha iyi kolları hatalar.

* Nix'ler için, genellikle ANSI çıkış kodlarıyla gidebilirsiniz, bu nedenle şöyle olur:

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

Bunun için kullanmak systemsadece çirkin.


6
"Bunun için sistemi kullanmak çok çirkin." - Neden? Elbette bana daha temiz görünüyor :)
Merlyn Morgan-Graham

17
@ MerlynMorgan-Graham: Bir friggin 'konsolunu temizlemek için bir kabuk süreci ortaya çıkarır. Bu ne açıdan temiz bir çözüm? : P Stdout'a yazmak yerine echovia system()kullanmak gibi .
Cat Plus Plus

1
Bir astar FTW! ;) Evet, şaka yapıyorum. Bir kabuk süreci ortaya çıkarması cevabınız için iyi bir bilgi, tho. * Nix sürümü için +1.
Merlyn Morgan-Graham

8
Kullanmak system()yaygın bir hatadır. Unices için de önerdiğiniz yöntem budur. POSIX sistemlerinde yapılması gereken budur. "Geri kaydırma" kuralını dahil etmemiş olsanız da, Win32 parçasını doğru anladınız.
JdeBP

1
Arşivlere gerek yok. jdebp.eu./FGA/clearing-the-tui-screen.html#CLS mevcuttur.
JdeBP

20

Linux / Unix ve belki diğerleri için ancak 10 TH2'den önceki Windows için değil:

printf("\033c");

terminali sıfırlayacaktır.


14

Tekerleği yeniden icat etmek zorunda kalmadan benim için en kolay yol.

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

8

pencere konsoluna birden çok satır çıktı vermek işe yaramaz .. sadece boş satırlar ekler. ne yazık ki, bu yöntem Windows'a özgüdür ve conio.h (ve clrscr () mevcut olmayabilir, bu da standart bir başlık değildir) veya Win API yöntemini içerir

#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 sistemi için çok daha basit, ncurses veya terminal işlevlerini kullanabilirsiniz

#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

Ekranı temizlemek için önce bir modül eklemeniz gerekir:

#include <stdlib.h>

bu, Windows komutlarını içe aktaracaktır. Ardından, (konsolu düzenleyen) Batch komutlarını çalıştırmak için 'sistem' işlevini kullanabilirsiniz. C ++ 'daki Windows'ta ekranı temizleme komutu şu şekilde olacaktır:

system("CLS");

Ve bu konsolu temizlerdi. Kodun tamamı şöyle görünecektir:

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

using namespace std;

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

Ve tüm ihtiyacın olan bu! İyi şanslar :)


3
system ("cls") bu soruna taşınabilir bir çözüm değildir, ancak Windows sistemlerinde çalışır.
CMS_95

4
Bu bir "modül" değildir. C ++ "modülleri" içermez. Ayrıca, stdlib.hC standardı tarafından belirtilmiştir ve "Windows komutlarını içe aktarmak" ile veya aslında Windows'un kendisiyle hiçbir ilgisi yoktur. O nitpick dışında, iyisin.
Orbit'te Hafiflik Yarışları

3

Windows'ta:

#include <cstdlib>

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

Linux / Unix'te:

#include <cstdlib>

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

2

system("cls")Ekranı temizlemek için kullanın :

#include <stdlib.h>

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

2
Kabul edilen cevapta zaten bahsedildi. Burada yeni bilgi yok.
Dialecticus

Sonra cout / wcout'tan kurtulun ve parçaları sisteme aktarın ("echo" + çıktınız);
Tanveer Badar

2

Ekranı temizlemeye yardımcı olabilecek Windows işlevlerine erişimi olmadığı için bunu MAC'de yapmak zordur. En iyi çözümüm, terminal temizlenene kadar döngü yapmak ve satır eklemek ve ardından programı çalıştırmaktır. Ancak, bunu öncelikle ve sık kullanırsanız, bu o kadar verimli veya hafıza dostu değildir.

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

2

Windows'ta birden çok seçeneğimiz var:

  1. clrscr () (Başlık Dosyası: conio.h)

  2. system ("cls") (Başlık Dosyası: stdlib.h)

Linux'ta system ("clear") (Header File: stdlib.h) kullanın


Herhangi bir sistem çağrısının () bir güvenlik sorunu olabileceğini unutmayın.
John Doe

0

İşte bunu yapmanın basit bir yolu:

#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 ();

Bu arabelleği temizleyecek (boşaltacaktır)


3
[Hata] 'Sistem' bildirilmedi.
LoveToCode

6
Bu c ++ / CLI içindir (aka .NET c ++)
FryGuy

-1
#include <cstdlib>

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

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

}

Her yerde sadece çağrı cls ()


OP'nin aradığı bu değil. Soruya eklenen yorumu okuyun.
Agi Hammerthief

-2

İşletim sisteminin açık konsol yöntemini system ("") üzerinden kullanabilirsiniz;
Windows için sistem ("cls") olacaktır; örneğin
ve farklı işletim sistemleri için üç farklı kod yayınlamak yerine. sadece hangi işletim sisteminin çalıştığını öğrenmek için bir yöntem yapın.
benzersiz sistem değişkenleri #Ifdef ile varsa sen algılayarak bunu yapabilirsiniz
mesela

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

düzenleme: tamamen yeniden yapılan soru

Basitçe hangi sistemde olduklarını test edin ve sisteme bağlı olarak bir sistem komutu gönderin. bu derleme zamanında ayarlanacak olsa da

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

Bu tamamen yeni bir yöntemdir!


3
Bunu yapmanın çok çok kötü bir yolu. Ayrıca konsolu temizlemiyor, sadece boş satırlar ekliyor. Yardım etmeyecek.
Vishnu Narang

Yaralanmaya hakaret eklemek coutiçin bir dosyaya yönlendirilmiş olabilir. O halde konsol kavramı yok.
Tanveer Badar

-3

kullanım: clrscr ();

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

3
"Eski Borland C derleyicilerinde <conio.h> 'da bir işlevdi. C ++ standart bir işlev değil." stackoverflow.com/a/930141/1058115
cojack

-7

En kolay yol, akışı birden çok kez yıkamaktır (ideal olarak herhangi bir konsoldan daha büyüktür) 1024 * 1024, muhtemelen hiçbir konsol penceresinin olamayacağı bir boyuttur.

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

  return 0;
}

Bununla ilgili tek sorun yazılım imleci; platforma / konsola bağlı olarak yanıp sönen şey (veya yanıp sönmeyen şey), konsolun tepesinin aksine konsolun sonunda olacaktır. Ancak bu asla umarız herhangi bir soruna yol açmamalıdır.


2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.