ตามชื่อเรื่อง. ฉันจะล้างคอนโซลใน C ++ ได้อย่างไร
ตามชื่อเรื่อง. ฉันจะล้างคอนโซลใน C ++ ได้อย่างไร
คำตอบ:
สำหรับ C ++ บริสุทธิ์
คุณทำไม่ได้ C ++ ไม่มีแนวคิดของคอนโซล
โปรแกรมสามารถพิมพ์ไปยังเครื่องพิมพ์ส่งออกไปยังไฟล์โดยตรงหรือถูกเปลี่ยนเส้นทางไปยังอินพุตของโปรแกรมอื่นสำหรับทุกสิ่งที่ใส่ใจ แม้ว่าคุณจะสามารถล้างคอนโซลใน C ++ ได้ แต่ก็จะทำให้กรณีเหล่านั้นยุ่งมากขึ้น
ดูรายการนี้ในคำถามที่พบบ่อยของ comp.lang.c ++:
เฉพาะระบบปฏิบัติการ
หากยังคงเหมาะสมที่จะล้างคอนโซลในโปรแกรมของคุณและคุณสนใจในโซลูชันเฉพาะของระบบปฏิบัติการสิ่งเหล่านี้ก็มีอยู่จริง
สำหรับ Windows (ในแท็กของคุณ) โปรดดูที่ลิงค์นี้:
แก้ไข: คำตอบนี้กล่าวถึงก่อนหน้านี้โดยใช้system("cls");
เนื่องจาก Microsoft บอกว่าจะทำเช่นนั้น แต่จะได้รับการชี้ให้เห็นในความคิดเห็นที่นี้ไม่ได้เป็นสิ่งที่ปลอดภัยที่จะทำ ฉันได้ลบลิงก์ไปยังบทความของ Microsoft เนื่องจากปัญหานี้
ห้องสมุด (พกพาได้บ้าง)
ncurses เป็นไลบรารีที่รองรับการจัดการคอนโซล:
system
และเพิ่มลิงก์ไปยังบทความของคุณเพื่ออธิบายสาเหตุ
สำหรับ Windows ผ่าน 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);
}
ยินดีที่จะเพิกเฉยต่อข้อผิดพลาดที่เป็นไปได้ทั้งหมด แต่เดี๋ยวก่อนกำลังล้างคอนโซล ไม่เหมือนกับการ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 ถูกต้องแม้ว่าคุณจะไม่ได้รวมอนุสัญญา "เลื่อนกลับ"
สำหรับ Linux / Unix และอาจมีบางรุ่น แต่ไม่ใช่สำหรับ Windows ก่อน 10 TH2:
printf("\033c");
จะรีเซ็ตเทอร์มินัล
วิธีที่ง่ายที่สุดสำหรับฉันโดยไม่ต้องสร้างล้อใหม่
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 จากนั้นคุณสามารถใช้ฟังก์ชัน 'system' เพื่อเรียกใช้คำสั่ง Batch (ซึ่งแก้ไขคอนโซล) บน Windows ใน C ++ คำสั่งในการล้างหน้าจอจะเป็น:
system("CLS");
และนั่นจะเป็นการล้างคอนโซล รหัสทั้งหมดจะมีลักษณะดังนี้:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
system("CLS");
}
และนั่นคือทั้งหมดที่คุณต้องการ! โชคดี :)
stdlib.h
ระบุโดยมาตรฐาน C และไม่มีส่วนเกี่ยวข้องกับ "การนำเข้าคำสั่ง 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)
ระบบ ("cls") (ไฟล์ส่วนหัว: stdlib.h)
ใน Linux ให้ใช้ system ("clear") (Header File: 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 () ได้ทุกที่
คุณสามารถใช้วิธี clear console ของระบบปฏิบัติการผ่าน system ("");
สำหรับ windows มันจะเป็นระบบ ("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;
}
ปัญหาเดียวคือเคอร์เซอร์ซอฟต์แวร์ สิ่งที่กะพริบ (หรือไม่กะพริบ) ขึ้นอยู่กับแพลตฟอร์ม / คอนโซลจะอยู่ที่ส่วนท้ายของคอนโซลตรงข้ามกับด้านบนของมัน อย่างไรก็ตามสิ่งนี้ไม่ควรก่อให้เกิดปัญหาใด ๆ อย่างหวัง