【问题标题】:No output is displayed on console for \b character控制台上不显示 \b 字符的输出
【发布时间】:2019-12-11 00:42:33
【问题描述】:

以下代码 sn-p 在 while 循环的每次迭代中不打印任何内容。实际输出仅在程序执行结束时打印。这个问题只会在 CentOS 中遇到,因为在 Windows 中,代码 sn-p 可以按预期工作。

std::cout << "Test \\b functionality: ";
int count = 0;
std::cout << count;
while (count < 10)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << std::string(std::to_string(count).length(), '\b');
    std::cout << ++count;
}

Removing "std::this_thread::sleep_for(std::chrono::seconds(1));" statement 在每次迭代时打印输出。

预期输出: 在每次迭代控制台上应该在擦除旧计数值后输出新的计数值。换句话说,控制台应该显示计数变量的最新值。

【问题讨论】:

  • stdout 默认是行缓冲的。尝试std::cout &lt;&lt; ++count &lt;&lt; std::flush 或使用std::unitbuf 在每次写入后自动刷新
  • @Botje 有点挑剔,它是名为stdoutFILE*,它是行缓冲的(除非它没有连接到终端,在这种情况下它是完全缓冲的)。 std::cout 本身是完全缓冲的,但由于它通常连接到 stdout 它实际上也是行缓冲的(除非没有连接到终端,如前所述)。
  • @Someprogrammerdude 对。我也应该在某处提到setvbuf :)
  • \b 无关。您应该尝试删除它,看看它是否与问题有关!

标签: c++ centos


【解决方案1】:

std::cout 是一个缓冲流,因此您必须flush 它以保证在close 之前写入数据:

std::cout << std::string(std::to_string(count).length(), '\b') << std::flush;
std::cout << ++count << std::flush;

【讨论】:

  • 感谢大家的快速回复,使用 std::flush 工作正常。
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2014-09-06
  • 2018-09-14
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多