使用' \ b'意外的控制台行为人物

时间:2015-10-28 07:48:45

标签: c++ c++11 console stdout

我的程序中有这样的代码:

std :: cout << process_prompt << std :: left << std :: setw( 40 ) <<  "Looping on tree: clust_tree.";
some_function();
std :: cout << std :: string( 52, '\b' );

some_function()有一个循环:

for( Int_t i = 0; i < n_entries; ++i ) 
{
    (some stuff...)
    if( i % 100000 == 0 )
    {
        percent_done = static_cast<float>(i) / n_entries;
        std :: cout << std :: setw( 4 ) << static_cast<int>(percent_done * 100) << "p" << std :: flush;
        std :: cout << std :: string( 5, '\b' ) << std :: flush;
    }
}

process_prompt只是一种奇特的方式,我用它来写一条彩色的消息说&#34;处理:&#34;。

我期望发生的事情是(每行都是前一行的更新):

Process: Looping on tree: clust_tree.            0   p
Process: Looping on tree: clust_tree.            10  p
...

实际发生的事情:

Process: Looping on tree: clust_tree.            0   p
12  pss: Looping on tree: clust_tree.            0   p
54  pss: Looping on tree: clust_tree.            0   p

不知何故,我的光标始终移动到行的beginnig。有人能告诉我我做错了什么吗?谢谢你的回复!

发现错误: 我有一些其他代码部分在循环中输出单个/ b字符。

2 个答案:

答案 0 :(得分:1)

注意:这是问题的不是答案,不确定这会对在线编译器有效,因此这里有完整示例的代码..

这个完整的例子适用于我(c ++ 11,gcc 4.8.2)

#include <iostream>
#include <chrono>
#include <thread>
#include <iomanip>

using namespace std;


int main(void) {
  cout << "Completed " << flush;
  for (auto i = 1; i <= 100; ++i) {
    cout << setw(4) << i << "%" << flush << string(5, '\b') << flush;  
    this_thread::sleep_for(chrono::milliseconds(100));
  }
  cout << endl << "Done" << endl;
}

答案 1 :(得分:0)

好吧我好像找到了答案,实际上我还有一个额外的&#39; / b&#39;对于每个循环。谢谢大家!