如何在 C++ 中清除控制檯

Jinku Hu 2020年11月7日
如何在 C++ 中清除控制檯

本文將介紹幾種在 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;
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn