【问题标题】:Printing on same line in c++在 C++ 中的同一行上打印
【发布时间】:2014-03-19 04:43:07
【问题描述】:

我试图将时间写在同一行,而不是堆叠输出。我似乎无法让它工作。

这就是我所拥有的:我认为"\r" 会使它在同一行重印,但这不起作用。我也试过printf("\r");,但也没有用。

谁能帮我弄清楚如何让它工作?

void countdown(int time)
{
    int h = (time / 3600);
    int m = (time / 60) - (h * 60);
    int s = time % 60;

    std::stringstream ss;
    ss << h << ":" << m << ":" << s;
    std::string string = ss.str();

    cout << "\r" << string << endl;
}

【问题讨论】:

标签: c++


【解决方案1】:
cout << "\r" << string << endl;

endl 将光标移动到下一行。尝试用std::flush 替换它,这样可以确保将输出发送到终端。 (您还应该#include &lt;iomanip&gt; 并使用std::setw(2) / std::setfill('0') 确保您显示的文本宽度不变,否则说时间从:

23:59:59

0:0:0

较早时间的尾随“:59”当前未被覆盖或清除(如果您的终端有一个,您可以写几个空格或发送一个清除到行尾的字符序列,但固定-宽度更有意义)。

所以最终:

std::cout << '\r'
          << std::setw(2) << std::setfill('0') << h << ':'
          << std::setw(2) << m << ':'
          << std::setw(2) << s << std::flush;

【讨论】:

  • 由于某种原因它告诉我no matching function for call to 'fill(char)'
  • 我觉得应该是setFill('0')
【解决方案2】:

试试这个:

cout << "\r" << string;

endl 插入换行符并刷新流。

【讨论】:

  • 这给了我一个编译器错误 "std::string" 非法使用这种类型的表达式。
  • @Fuujin 编译器是什么? gcc 似乎没问题。
【解决方案3】:

endl 插入换行符并刷新流。

cout << "\r" << string ; //works

【讨论】:

    【解决方案4】:

    我想先提供一些有用的信息。

    您正在插入std::endl,它将在下一行打印下一个字符串。

    std::endl 是换行符 \n 后跟 std::flush

    以下换行符\nstd::flush 等价于std::endl

    std::cout << printFunction() << '\n' << std::flush;
    

    就像

    std::cout << printFunction() << std::endl;
    

    现在删除 std::endl 将在同一行打印字符串。

    cout << "\r" << string;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2011-08-01
      • 2014-01-29
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 2015-12-01
      相关资源
      最近更新 更多