在C/C++中,如何在标准输出中编辑某个“坐标”?
我最近一直在使用Vim,我想知道程序是如何在终端的某些位置改变字符的。例如,使用:rc时,它将光标下的字符替换为c 我也看到过用自制软件做的类似事情,它会在屏幕上打印进度条,并在必要时进行更新在C/C++中,如何在标准输出中编辑某个“坐标”?,c++,c,terminal,C++,C,Terminal,我最近一直在使用Vim,我想知道程序是如何在终端的某些位置改变字符的。例如,使用:rc时,它将光标下的字符替换为c 我也看到过用自制软件做的类似事情,它会在屏幕上打印进度条,并在必要时进行更新 这是如何在C/C++中进行的? 在C++中没有标准的方法来做这件事。p> 它是通过依赖操作系统的lbiraries完成的,例如Unix/Linux世界中的和类似的库。其中一些库已跨平台移植,例如: 对于非常简单的事情,如进度条或计数器,只要您停留在一行上,就可以在输出中使用\r,将光标放回当前行的开头。例
<>这是如何在C/C++中进行的? 在C++中没有标准的方法来做这件事。p> 它是通过依赖操作系统的lbiraries完成的,例如Unix/Linux世界中的和类似的库。其中一些库已跨平台移植,例如: 对于非常简单的事情,如进度条或计数器,只要您停留在一行上,就可以在输出中使用\r,将光标放回当前行的开头。例如:
for (int i = 0; i < 100; i++) {
cout << "\rProgress: " << setw(3) << i;
this_thread::sleep_for(chrono::milliseconds(100));
}
我不确定是否完全理解您的意思,但是通过创建一个包含100个char类型元素的数组,您可以修改数组的任何位置,并使用std:cout将其循环到控制台上。 也许可以更好地定义50个字符的数组,以恢复打印结果的大小 例如,如果必须在1%过程中打印一个进度条,则应打印:
Char progressbar[100] = {'X','','','','','','','','',........}
如前所述,除了将必要的控制字符写入屏幕之外,这与stdout或cout提供的任何C/C++标准操作无关 控制ASCII终端的屏幕光标完全取决于所使用的特定终端程序的实现,除此之外,没有制定标准 有一些库,例如用于更广泛的linux终端实现,或用于windows CMD shell。当然,使用ncurses或类似库是一个很好的答案。另一种方法是在某些终端模拟器中控制光标,而不是在Windows命令shell中。例如,此代码以多种颜色打印一行,然后将光标移动到2,2坐标系,以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';
}
您可能需要研究源代码,以掌握实际操作过程。