最近我一直在使用Vim,我想知道程序如何设法改变终端中某些位置的字符。例如,当使用:rc时,它用c替换光标下的字符。在C/C++中,如何在标准输出中编辑某个'坐标'?
我也看到过用Homebrew做的类似的事情,它会在屏幕上打印一个进度条,并在必要时更新它。
这是如何在C/C++中完成的?
最近我一直在使用Vim,我想知道程序如何设法改变终端中某些位置的字符。例如,当使用:rc时,它用c替换光标下的字符。在C/C++中,如何在标准输出中编辑某个'坐标'?
我也看到过用Homebrew做的类似的事情,它会在屏幕上打印一个进度条,并在必要时更新它。
这是如何在C/C++中完成的?
在C++中没有这样做的标准方法。
它在Unix/Linux世界中与OS依赖的lbiraries完成,例如curses和类似的库(ncurses)。其中一些库已经跨平台移植(例如:PDCurses)
对于非常简单的事情,例如进度条或计数器,只要您保留在单行上,就有使用“\ r“(carriage return),将光标放回当前行的开头。例如:
for (int i = 0; i < 100; i++) {
cout << "\rProgress: " << setw(3) << i;
this_thread::sleep_for(chrono::milliseconds(100));
}
我不知道完全理解你,但与创建char类型的100个元素的数组,你可以修改数组和循环将其与性病的任何位置:COUT到mostrate它的安慰。 或许可以更好地定义50个字符的数组以恢复打印结果的大小。
例如,如果你要打印在1%处理的progessbar,应打印:
Char progressbar[100] = {'X','','','','','','','','',........}
如所提到的,这不是任何C的问题/ C++标准操作设置有stdout
或cout
(除了将必要的控制字符写入屏幕)。
控制ASCII终端的屏幕光标完全取决于所使用的特定终端程序的实现,除了very narrow set of control characters之外,还没有建立标准。
对于更多种类的linux终端实现,有像ncurses这样的库,或者对于Windows CMD shell有PDcurses这样的库。
当然,使用ncurses
或类似的库是一个很好的答案。另一种方法是使用ANSI Escape Codes来控制某些终端仿真器中的光标(但不是Windows命令行界面)。例如,此代码以多种颜色打印一行,然后将光标移动到2,2(坐标为1,1,1为左上角),并以红色打印单词“red”。
#include <iostream>
#include <string>
const std::string CSI{"\x1b["};
const std::string BLUE{CSI + "34m"};
const std::string RED{CSI + "31m"};
const std::string RESET{CSI + "0m"};
std::ostream &curpos(int row, int col)
{
return std::cout << CSI << row << ';' << col << 'H';
}
int main()
{
std::cout << "This is " << BLUE << "blue" << RESET << " and white.\n";
curpos(2,2);
std::cout << RED << "red" << RESET << '\n';
}
您可能想研究[ncurses](https://www.gnu.org/software/ncurses/)源代码,以掌握实际完成的方式。 – 2015-02-08 12:35:45