如何在 C++ 中清除控制檯
Jinku Hu
2023年10月12日
本文將介紹幾種在 C++ 中清除控制檯的方法。
使用 ANSI 轉義碼清除控制檯
沒有內建的 C++ 語言功能來操作控制檯和清除輸出文字。然而,ANSI 轉義碼可以是一種相對可移植的方式來實現這個目標。轉義碼是以 ASCII 轉義字元和括號字元開頭的位元組序列,後面是引數。這些字元可以插入到輸出字串中,控制檯將它們解釋為命令而不是要顯示的文字。
ANSI 程式碼包括多個控制檯輸出序列,具有上/下移動游標、行內擦除、滾動等功能和其他一些選項。下面的程式碼示例使用了顯示中擦除序列,它可以清除整個螢幕,並且不刪除回滾緩衝區。請注意,我們構建了一個單獨的函式,命名為 clear
,以使程式碼更加靈活和可讀。
#include <iostream>
using std::cout;
using std::endl;
void Clear() { cout << "\x1B[2J\x1B[H"; }
int main() {
cout << "Some console filling text ..." << endl;
cout << "Another filler string for the stdout\n"
"Another filler string for the stdout\n"
"Another filler string for the stdout\n"
"Another filler string for the stdout\n"
"Another filler string for the stdout\n"
<< endl;
Clear();
return EXIT_SUCCESS;
}
另外,我們也可以插入同樣的轉義序列,並稍作修改(用 3 代替 2)來清除整個控制檯螢幕,並刪除回滾緩衝區,如下面的程式碼示例所示。一些有用的 ANSI 控制序列在下表中有描述。你也可以參考這個 Wikipedia 頁面。
程式碼 | 名稱 | 效果 |
---|---|---|
CSI n A |
游標向上 | 將終端游標向上移動 n 個單元格。單元格的預設值是 1。如果游標已經在邊緣,序列命令沒有效果。 |
CSI n B |
游標向下 | 將終端游標向下移動 n 個單元格,預設值為 1。如果游標已經在邊緣,該序列命令沒有任何效果。 |
CSI n J |
清除顯示 | 清除終端視窗的一部分。如果 n 為 0 或未指定,命令從游標的當前位置開始清除,直到視窗的末端。如果 n 為 1,命令從游標位置到視窗的起始位置進行清除。如果 n 是 2 個全屏,命令清除整個螢幕。如果 n 是 3,命令清除整個視窗,並刪除回捲緩衝區中的行。 |
CSI n K |
行內清除 | 刪除該行的部分內容。如果 n 為 0 或未指定,命令從游標到行尾清除。如果 n 為 1,命令從游標到行首清除。如果 n 是 2,則清除整個行。 |
#include <iostream>
using std::cout;
using std::endl;
void ClearScrollback() { cout << "\x1B[3J\x1B[H"; }
int main() {
cout << "Some console filling text ..." << endl;
cout << "Another filler string for the stdout\n"
"Another filler string for the stdout\n"
"Another filler string for the stdout\n"
"Another filler string for the stdout\n"
"Another filler string for the stdout\n"
<< endl;
ClearScrollback();
return EXIT_SUCCESS;
}