Як у назві. Як я можу очистити консоль у C ++?
Як у назві. Як я можу очистити консоль у C ++?
Відповіді:
Для чистого C ++
Ви не можете. C ++ навіть не має поняття консолі.
Програма може друкувати на принтері, виводити безпосередньо у файл або перенаправляти на вхід іншої програми для всіх, про що вона турбується. Навіть якби ви змогли очистити консоль у C ++, це зробило б ці справи суттєвішими.
Дивіться цей запис у поширених запитаннях comp.lang.c ++:
Специфічні для ОС
Якщо все-таки є сенс очистити консоль у вашій програмі, і ви зацікавлені у вирішенні конкретних операційних систем, вони справді існують.
Для Windows (як у вашому тегу) перевірте це посилання:
Редагувати: Ця відповідь, згадана раніше, була використана system("cls");
, оскільки Microsoft сказала, що це потрібно зробити. Однак у коментарях зазначалося, що це не безпечно робити . Через цю проблему я видалив посилання на статтю Microsoft.
Бібліотеки (дещо портативні)
ncurses - це бібліотека, яка підтримує маніпуляції з консоллю:
system
, і додав посилання до вашої статті, пояснюючи, чому.
Для Windows через консольний 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
для цього просто некрасиво.
echo
via system()
замість того, щоб писати на stdout.
system()
- типова помилка. Так само, це ваш запропонований метод для Unices. Це те, що слід робити на системах POSIX. Ви правильно розробили частину Win32, хоча і не включили домовленість про "прокрутку назад".
Мені найпростіший спосіб без необхідності винаходити колесо заново.
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
}
#include <conio.h>
clrscr();
std::cout<< u8"\033[2J\033[1;1H";
TERM environment variable not set.
виводити декілька рядків на віконну консоль марно ... він просто додає до нього порожні рядки. на жаль, спосіб є специфічним для 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" ) );
}
// #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;
}
Щоб очистити екран, спочатку потрібно буде включити модуль:
#include <stdlib.h>
це імпортує команди windows. Потім ви можете використовувати функцію "система" для запуску командних команд (які редагують консоль). У Windows на C ++ команда для очищення екрана буде такою:
system("CLS");
І це очистило б консоль. Весь код буде виглядати так:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
system("CLS");
}
І це все, що вам потрібно! Удачі :)
stdlib.h
це визначено стандартом С і не має нічого спільного ні з "імпортом команд windows", ні навіть із самою Windows. Окрім цього нікчемного, ти в порядку.
У Windows:
#include <cstdlib>
int main() {
std::system("cls");
return 0;
}
У Linux / Unix:
#include <cstdlib>
int main() {
std::system("clear");
return 0;
}
Це важко зробити на MAC, оскільки він не має доступу до функцій Windows, які можуть допомогти очистити екран. Моє найкраще виправлення - це петля і додавання рядків, поки термінал не стане чистим, а потім запуск програми. Однак це не настільки ефективно або зручно пам’яті, якщо ви використовуєте це переважно і часто.
void clearScreen(){
int clear = 5;
do {
cout << endl;
clear -= 1;
} while (clear !=0);
}
Використовуйте system("cls")
для очищення екрана:
#include <stdlib.h>
int main(void)
{
system("cls");
return 0;
}
У Windows ми маємо кілька варіантів:
clrscr () (Файл заголовка: conio.h)
system ("cls") (Файл заголовка: stdlib.h)
У Linux використовуйте систему ("очистити") (Заголовок: stdlib.h)
Ось простий спосіб зробити це:
#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 ();
Це очистить (спорожнить) буфер
#include <cstdlib>
void cls(){
#if defined(_WIN32) //if windows
system("cls");
#else
system("clear"); //if other
#endif //finish
}
Просто зателефонуйте cls () куди завгодно
Ви можете скористатися методом прозорої консолі операційної системи через систему ("");
для вікон це була б система ("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
}
редагувати: повністю перероблене питання
Просто перевірте, в якій системі вони працюють, і надішліть системну команду залежно від системи. хоча це буде встановлено під час компіляції
#ifdef __WIN32
system("cls");
#else
system("clear"); // most other systems use this
#endif
Це абсолютно новий метод!
cout
можливо, було перенаправлено до файлу. Тоді поняття консолі взагалі не існує.
використання: clrscr ();
#include <iostream>
using namespace std;
int main()
{
clrscr();
cout << "Hello World!" << endl;
return 0;
}
Найпростішим способом було б промити потік кілька разів (в ідеалі більше, ніж будь-яка можлива консоль) 1024 * 1024 - це, ймовірно, розмір, якого ніколи не могло бути вікно консолі.
int main(int argc, char *argv)
{
for(int i = 0; i <1024*1024; i++)
std::cout << ' ' << std::endl;
return 0;
}
Єдина проблема з цим - програмний курсор; ця річ, що блимає (або немигаюча річ) залежно від платформи / консолі, буде в кінці консолі, на противагу її верхній частині. Однак це ніколи не повинно викликати жодних проблем, сподіваємось.