【问题标题】:Not able to make carriage return work on linux无法在 linux 上进行回车
【发布时间】:2015-06-26 05:42:18
【问题描述】:

这段代码有问题:

#include <iostream>
#include <math.h>
#include <unistd.h>
#include <string>
#include <iostream>
#include <stdio.h>

using std::cout; using std::cerr;
using std::cin;  using std::string;
using std::endl;

int main(int argc,char* argv[])
{
    for(int x = 0; x <= 2013; x++)
    {

        cout << "Iteration: "<< x << "\r";
        cout << "";

    }

    return 0;
}

我需要我的代码来打印“迭代:0”,而不仅仅是将 0 刷新为 1、2、3、4.... 一个控制台线上的所有内容。我使用了回车,但它不起作用,一行一行的打印出来,就像我使用“\ n”时一样。环境是linux 64位。 IDE是eclipse 8.01。

【问题讨论】:

  • @iamkrillin:无论如何,Linux 确实使用\r
  • 无法复制。我建议在迭代之间手动刷新,但缺少它不应导致您描述的行为。您使用的终端模拟器有什么特别之处吗?
  • 你的代码对我有用。
  • 您必须在能够理解 ANSI 字符控制代码的控制台中运行它。 Linux 上的大多数终端模拟器默认情况下都会这样做。
  • 你用的是什么终端模拟器?

标签: c++ linux console-application


【解决方案1】:

你必须把它放在行首:

cout << "\rIteration: "<< x;

编辑:我已经测试了对原始 OP 代码的修改,它打印了他想要的内容。另外,Oh dear look what I've found

此外,正如@Wintermute 所建议的,您可以在 for 循环中执行以下操作,以获得更好的可视化效果:

cout << "\rIteration: "<< x << std::flush;
sleep(1);

【讨论】:

  • @chris 您无法在 coliru 中对其进行测试(我也在 ideone 中尝试过),但它可以在常规的 linux 终端中使用。某些 IDE 集成终端(例如 QtCreator's)也会发生同样的情况
  • 确实如此。但是,问题中的代码也有效;唯一的区别是整个事情结束后光标结束的地方。而当它显示出来时,这是一个冲洗的问题。
  • 你把它放在每次迭代之后还是每次迭代之前完全无关紧要。除了第一次迭代以及最后一次迭代之后的任何文本,结果完全相同。 OP 说它根本不起作用,所以这不是问题。
  • 为什么是-1?您必须在 引入新行之后执行回车,因此它会覆盖前一行。
  • 确保从 IDE 外部运行程序,打开一个新终端并运行可执行文件...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2017-08-20
  • 2014-04-08
  • 2013-05-28
  • 2013-04-10
  • 1970-01-01
相关资源
最近更新 更多