首先要理解的是,C++ 没有屏幕的概念,作为语言的标准部分。标准输出可能是文件,打印机和 cout 不知道区别。
然而,屏幕“设备”本身通常更智能一些,并且可以识别一些命令。其中应用最广泛的是 '\r' - 回车和 '\n' - 换行。'\r' 将光标移动到行首,'\n' 前进到下一行,但这不符合您的需求,因为您已经尝试过。
似乎这里唯一的前进方式是使用curses(其中ncurses只是一种实现,尽管Linux中的标准实现)。它为您提供了一个虚拟屏幕,其中包含用于更新它们的各种命令。然后它只采用更改的部分,并以优化的方式更新终端。
这只是使用 ncurses 的典型 C 程序的一个示例,值得一看:
#include <ncurses.h>
int main()
{
int ch;
initscr(); /* Start curses mode */
raw(); /* Line buffering disabled */
keypad(stdscr, TRUE); /* We get F1, F2 etc.. */
noecho(); /* Don't echo() while we do getch */
printw("Type any character to see it in bold\n");
ch = getch(); /* If raw() hadn't been called
* we have to press enter before it
* gets to the program */
printw("The pressed key is ");
attron(A_BOLD);
printw("%c", ch);
attroff(A_BOLD);
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}
printw() 函数写入“虚构”屏幕。它将内容放入缓冲区并更新一些标志并进行其他一些内部 ncurses 簿记。它实际上不会向您的真实屏幕(控制台窗口)写入任何内容。
您可以根据需要编写尽可能多的 printw() ,但是这些内容不会显示在真实屏幕上,直到您的程序执行其他操作以使“虚构的”屏幕缓冲区内容进入真实屏幕。
导致从 printw() 缓冲区更新真实屏幕的一件事是 refresh() (正如上面的源代码示例所做的那样)。