Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C/C++中,如何在标准输出中编辑某个“坐标”?_C++_C_Terminal - Fatal编程技术网

在C/C++中,如何在标准输出中编辑某个“坐标”?

在C/C++中,如何在标准输出中编辑某个“坐标”?,c++,c,terminal,C++,C,Terminal,我最近一直在使用Vim,我想知道程序是如何在终端的某些位置改变字符的。例如,使用:rc时,它将光标下的字符替换为c 我也看到过用自制软件做的类似事情,它会在屏幕上打印进度条,并在必要时进行更新 这是如何在C/C++中进行的? 在C++中没有标准的方法来做这件事。p> 它是通过依赖操作系统的lbiraries完成的,例如Unix/Linux世界中的和类似的库。其中一些库已跨平台移植,例如: 对于非常简单的事情,如进度条或计数器,只要您停留在一行上,就可以在输出中使用\r,将光标放回当前行的开头。例

我最近一直在使用Vim,我想知道程序是如何在终端的某些位置改变字符的。例如,使用:rc时,它将光标下的字符替换为c

我也看到过用自制软件做的类似事情,它会在屏幕上打印进度条,并在必要时进行更新


<>这是如何在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';
}
您可能需要研究源代码,以掌握实际操作过程。