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

Jinku Hu 2023年10月12日
如何在 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;
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook