【问题标题】:easy c++ loop with pause but output is very weird!带有暂停的简单 c++ 循环,但输出非常奇怪!
【发布时间】:2011-03-27 19:37:37
【问题描述】:

我只是想编写一个程序,它输出一系列数字,在控制台屏幕的同一行上相互覆盖。比如 10 9 8 7 6 等。

我正在使用 xcode 并在 xcode 中进行编译。这输出“10 121469 121468”,我做错了什么?为什么看起来不那么明显?

#include <iomanip>
#include <iostream>
using namespace std;

#ifdef __GNUC__
#include <unistd.h>
#elif defined _WIN32
#include <cstdlib>
#endif

int main()
{

  cout << "Description: This program will show you how much change" << endl;
  cout << "you will need to complete a transaction using a already" << endl;
  cout << "specified denomination" << endl << endl;

  cout << "CTRL=C to exit...\n";

  for (int units = 10; units > 0; units--)
  {
    cout << units << ' ';
    cout.flush();

#ifdef __GNUC__
    sleep(1); //one second
#elif defined _WIN32
    _sleep(1000); //one thousand milliseconds
#endif

    cout << '/r'; // CR
  }

  return 0;
} //main

【问题讨论】:

  • 互相“覆盖”到底是什么意思?通常不可能在输出流上“备份”。一方面,CR 的转义序列是 \r,而不是 /r。
  • @debracey:实际上,在控制台上输出\r 转义序列(显然是 OP 打错了)返回光标回到行首。这就是 OP 如何“覆盖”控制台上的先前输出。

标签: c++ loops timer


【解决方案1】:

我不知道这是否回答了您的答案,但我发现您的 CR 是错误的。

cout << '/r'; // CR

是 2 个字符(即打印在屏幕上的 12146)。正确的值必须是

cout << '\r'; // CR

【讨论】:

    【解决方案2】:

    这一行是错误的:

    cout << '/r'; // CR
    

    这是两个字符,你想要

    cout << '\r'; // CR
    

    【讨论】:

    • 我花了更多时间才发现它。
    【解决方案3】:

    在 n*x 上,我使用以下 ANSI 转义码删除当前行并将光标移动到开头。

    \033[0F\033[2K
    

    所以你可以通过以下方式使用它:

    cout << "\033[0F\033[2K" << units << endl;
    

    在以下页面上,您可以仔细阅读所有详细信息:

    http://en.wikipedia.org/wiki/ANSI_escape_sequences

    该页面上还有一个链接,说明如何在 windows 上实现类似的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 2014-04-09
      • 1970-01-01
      相关资源
      最近更新 更多