2015-02-08 219 views
2

最近我一直在使用Vim,我想知道程序如何设法改变终端中某些位置的字符。例如,当使用:rc时,它用c替换光标下的字符。在C/C++中,如何在标准输出中编辑某个'坐标'?

我也看到过用Homebrew做的类似的事情,它会在屏幕上打印一个进度条,并在必要时更新它。

这是如何在C/C++中完成的?

+4

您可能想研究[ncurses](https://www.gnu.org/software/ncurses/)源代码,以掌握实际完成的方式。 – 2015-02-08 12:35:45

回答

5

在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)); 
} 
-2

我不知道完全理解你,但与创建char类型的100个元素的数组,你可以修改数组和循环将其与性病的任何位置:COUT到mostrate它的安慰。 或许可以更好地定义50个字符的数组以恢复打印结果的大小。

例如,如果你要打印在1%处理的progessbar,应打印:

Char progressbar[100] = {'X','','','','','','','','',........} 
0

如所提到的,这不是任何C的问题/ C++标准操作设置有stdoutcout(除了将必要的控制字符写入屏幕)。

控制ASCII终端的屏幕光标完全取决于所使用的特定终端程序的实现,除了very narrow set of control characters之外,还没有建立标准。

对于更多种类的linux终端实现,有像ncurses这样的库,或者对于Windows CMD shell有PDcurses这样的库。

1

当然,使用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'; 
} 
相关问题