如何获得控制台输出以覆盖控制台而不是纯文本输出?

时间:2019-12-17 11:53:20

标签: c++ c

编辑:这是此问题的续集。 Drawing colors to console causes color flicker

因此,在C / C ++中,像printfcout这样的命令将写入纯文本输出。因此,设计用于80×25文本显示和60fps的视频游戏每帧必须输出2000个字符的文本。我想在屏幕上书写,就像一个命令,例如将一个字符串写入第12行或第4列的第9至第9列,而不是每次更改时都不断添加纯文本。我不是说图形输出,这仍然是文本模式,而不是纯文本嵌入控制台类型的文本模式。

编辑:对于那些想知道的人,每个动画帧输出纯文本整个屏幕的代码如下:https://github.com/PiotrGrochowski/testsortingvisualization/blob/master/test.cpp。有时会出现故障,而且我还没有计算出速度(是否为60fps)。

编辑:文本显示固定为80×25的概念确实的确意味着没有滚动或换行的概念。

编辑:https://en.wikipedia.org/wiki/VGA-compatible_text_mode。如何在C / C ++编程中将其显示到命令提示符?

1 个答案:

答案 0 :(得分:3)

对于简单的操作,例如光标位置和文本颜色,可以使用ANSI转义码:https://en.wikipedia.org/wiki/ANSI_escape_code#Terminal_output_sequences 如果控制台支持它(在Linux,Unix,Mac以及据称在Windows 10中也是如此),它将可以正常工作。

此处是一个示例:https://rosettacode.org/wiki/Terminal_control/Cursor_positioning#C.2FC.2B.2B

如果控制台支持ANSI转义码,则以下内容将在第6行第3列上打印“ Hello”:

#include <stdio.h>
int main()
{
    printf("\033[6;3HHello\n");
    return 0;
}

在Windows上,如果控制台不支持ANSI,则具有Windows特定的功能:

#include <windows.h>

int main() {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos = {3, 6};
    SetConsoleCursorPosition(hConsole, pos);
    WriteConsole(hConsole, "Hello", 5, NULL, NULL);
    return 0;
}

您还可以将ncurses库用于POSIX。