Başlıkta olduğu gibi. C ++ 'da konsolu nasıl temizleyebilirim?
Başlıkta olduğu gibi. C ++ 'da konsolu nasıl temizleyebilirim?
Yanıtlar:
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:
system
makalenize nedenini açıklayan bir bağlantı ekledi.
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 system
sadece çirkin.
echo
via system()
kullanmak gibi .
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.
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" ) );
}
// #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;
}
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 :)
stdlib.h
C 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.
Windows'ta:
#include <cstdlib>
int main() {
std::system("cls");
return 0;
}
Linux / Unix'te:
#include <cstdlib>
int main() {
std::system("clear");
return 0;
}
system("cls")
Ekranı temizlemek için kullanın :
#include <stdlib.h>
int main(void)
{
system("cls");
return 0;
}
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);
}
Windows'ta birden çok seçeneğimiz var:
clrscr () (Başlık Dosyası: conio.h)
system ("cls") (Başlık Dosyası: stdlib.h)
Linux'ta system ("clear") (Header File: stdlib.h) kullanın
İş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
}
System :: Console :: Clear ();
Bu arabelleği temizleyecek (boşaltacaktır)
#include <cstdlib>
void cls(){
#if defined(_WIN32) //if windows
system("cls");
#else
system("clear"); //if other
#endif //finish
}
Her yerde sadece çağrı cls ()
İş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
}
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!
cout
için bir dosyaya yönlendirilmiş olabilir. O halde konsol kavramı yok.
kullanım: clrscr ();
#include <iostream>
using namespace std;
int main()
{
clrscr();
cout << "Hello World!" << endl;
return 0;
}
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.