【问题标题】:C++ Change Output From "cout"C++ 从“cout”更改输出
【发布时间】:2011-05-22 06:40:11
【问题描述】:

是否可以更改用“cout”打印的文本?我想让它显示某事物的当前百分比,而不必为每个百分比都有一个新行。这可能吗?

【问题讨论】:

  • cout 不应该是控制台的抽象,尽管大多数终端会很乐意正确解释回车符。
  • 你需要澄清你的问题,不清楚你想要实现什么以及“改变”是什么意思。
  • 一般来说是不可能的。 (假设cout 的输出直接馈送到打印机。你将如何指示它“取消打印”最后一行?)cout 是一个输出流,它不假设输出发送到哪个介质,或关于该媒体的能力。在某些情况下,特定的技巧可以达到您想要的效果,但在其他情况下会失败。如果您想要比直接输出纯文本更动态的东西,也许cout 不是正确使用的工具。
  • std::cout 不假定输出到终端。那里有一些库可以理解终端的适当控制序列,允许您显式地操纵光标位置(示例 ncurses)。对于简单的一次性应用程序,通过 '\r' 进行简单输出就足够了。

标签: c++ console-application cout


【解决方案1】:

你绝对不会从 cout 得到的一件事是终端线长度。由于这可以更改,您可能会使用太长的行,这(使用 '\r')将导致每次更新都打印新行。如果您想使用特定平台,请使用特定于平台的函数来获取终端大小(请注意,您可能根本不会连接到任何终端,例如重定向到文件)。

【讨论】:

    【解决方案2】:

    一般来说这是不可能的。 (假设cout 的输出直接馈送到打印机。你将如何指示它“取消打印”最后一行?)cout 是一个输出流,它不假设输出发送到哪个介质,或关于该媒体的能力。在某些情况下,特定的技巧可以达到您想要的效果,但在其他情况下会失败。如果您想要比直接输出纯文本更动态的东西,也许cout 不是合适的工具。

    【讨论】:

      【解决方案3】:

      这对我有用:

      std::cout << "1111";
      std::cout << "\r";
      std::cout << "2222";
      

      \r 是回车符。将“光标”放回行首。

      您也可以使用\b 字符。这是退格。打印时它会返回一个字符。

      【讨论】:

      • 你有 3 个\r(回车)比你实际需要的多(除非你的意思是\b,退格)
      • 正确的行尾符号是“\n”,而不是“\r”。标准库会将“\n”解释为 CR-LF、LF-CR 或任何适合您平台的内容。还有 std::endl,它还强制刷新缓冲区。
      • @Gene Bushuyev:你在说什么? OP 要求退格或回车,以覆盖先前的输出。
      • @Gene: \r 是换行符,\n 是换行符。 OP 要求的是如何覆盖控制台上已经存在的数据,而不是如何向其中添加新行。 \r 将强制光标回到当前行的开头(并且将来的输出将覆盖那里的任何内容)。 \b 将擦除控制台上的最后一个字符,未来的输出将替换它。这正是 OP 所要求的。
      • @Gene Bushuyev:不太正确。文件的 iostream(cin/cout 是文件流的类型)将“\n”转换为/从依赖于平台的行尾序列结束。 @detunized '\r' 的解释取决于所使用的终端。要获得独立于终端的光标移动,您需要使用理解终端控制序列的适当库。但是说 '\r' 应该在大多数地方都可以工作,并且对于 OP 来说可能就足够了。
      猜你喜欢
      • 2011-10-31
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多