Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++_Linux_Text_Terminal - Fatal编程技术网

C++ 如何在不重新打印的情况下更新终端中的打印消息

C++ 如何在不重新打印的情况下更新终端中的打印消息,c++,linux,text,terminal,C++,Linux,Text,Terminal,我想为我的终端应用程序制作一个进度条,其工作方式如下: [XXXXXXX ] 这将直观地指示流程完成前还有多少时间 我知道我可以通过将X添加到字符串中,然后简单地打印F来打印越来越多的X,但这看起来像: [XXXXXXX ] [XXXXXXXX ] [XXXXXXXXX ] [XXXXXXXXXX ] 或者类似的东西(很明显你们可以利用间距),但这并不是视觉上的审美。有没有一种方法可以在不重新打印的情况下用新文本更新终端中的

我想为我的终端应用程序制作一个进度条,其工作方式如下:

 [XXXXXXX       ] 
这将直观地指示流程完成前还有多少时间

我知道我可以通过将X添加到字符串中,然后简单地打印F来打印越来越多的X,但这看起来像:

 [XXXXXXX       ] 
 [XXXXXXXX      ] 
 [XXXXXXXXX     ] 
 [XXXXXXXXXX    ] 

或者类似的东西(很明显你们可以利用间距),但这并不是视觉上的审美。有没有一种方法可以在不重新打印的情况下用新文本更新终端中的打印文本?这都是Linux下的,C++。< /p> 在打印新的“版本”时,尝试使用<代码> \r>代码>代替<代码> \n>代码>
for(int i=0;i我想说像ncurses这样的库可以用来处理这些事情。curses帮助在屏幕上移动光标并绘制文本等等

类似这样的内容:

std::stringstream out;
for (int i = 0; i< 10; i++)
{
  out << "X";
  cout << "\r" << "[" << out.str() << "]";
}
std::stringstream out;
对于(int i=0;i<10;i++)
{

out“\r”将执行回车操作。假设打印机在没有换行符(“\n”)的情况下执行回车操作。这将使写入点返回到行首…然后在原始行的顶部重新打印更新的状态。

这是一种不同的语言,但可能对您有所帮助。基本上,转义字符\r(回车符,而不是换行符)将您移回当前打印行的开头,以便覆盖已打印的内容。

另一个选项是一次只打印一个字符。通常,stdout是行缓冲的,因此您需要调用fflush(stdout)--

for(int i=0;i<50;++i){
putchar('X');fflush(stdout);
/*在这里做些事情*/
}
putchar('\n');

但是它没有表示完成的漂亮的终止“]”。

其他人已经指出,您可以使用
\r
返回到当前行的开头,并覆盖整行

另一种可能是使用退格字符(“\b”)擦除一些空格,并仅覆盖这些空格。这有两个优点。首先,它明显避免了必须重新生成行中的所有内容,这有时会有点痛苦(尽管这是相当不寻常的)。其次,它可以避免在显示数据时出现一些麻烦(例如,在编写数据时数据大小会缩小)——例如,如果使用
\r
显示从100到0的倒计时,则必须小心覆盖之前的整个长度,否则倒计时将从(例如)100到990(即,保留之前的“0”)完整的)


但是,请注意,当一行中的后空位正常工作时,一行开头的后空位可能会或可能不会将光标/写入位置移回前一行。出于最实际的目的,您只能在一行内移动。

我不久前编写了此加载栏实用程序。可能有用

你可以在这里定制任何东西

int max = 1000;
LoadingBar* lb = new LoadingBar(10, 0, max);

for (size_t i = 0; i <= max; i++)
{
    lb->print();
    lb->iterate();
}
cout << lb->toString() << endl;
int max=1000;
加载杆*lb=新加载杆(10,0,最大值);
对于(size_t i=0;i print();
lb->iterate();
}

cout toString()听起来有点过头了。是的,可能…只是一个建议,如果将来有人想变得更花哨;)是的…在我们等待进度条时,可能会有一场乒乓球游戏。:d谢谢提示;)我知道ncurses,我以前用过它来制作一个终端刽子手游戏,但我想在使用它之前四处打听一下,因为我知道它太过分了
for(int i = 0; i < 50; ++i) {
   putchar('X'); fflush(stdout);
   /* do some stuff here */
}
putchar('\n');
int max = 1000;
LoadingBar* lb = new LoadingBar(10, 0, max);

for (size_t i = 0; i <= max; i++)
{
    lb->print();
    lb->iterate();
}
cout << lb->toString() << endl;