C++如何将输出从"cout"更改

5

是否可以更改使用“cout”打印的文本? 我想显示某些内容的当前百分比,而无需为每个百分比换行。这是可能的吗?


cout 不应该是控制台的抽象,虽然大多数终端都可以很好地解释回车字符。 - lijie
你需要澄清你的问题,不清楚你想要实现什么以及“change”是什么意思。 - Gene Bushuyev
一般情况下是不可能的。(想象一下,如果将cout的输出直接传送给打印机,你如何指示它“取消打印”最后一行?)cout是一个输出流,它对输出发送到哪个介质或该介质的能力没有任何假设。在某些情况下,可以使用特定的技巧来实现你想要的效果,但在其他情况下可能会失败得很糟糕。如果你想要比纯文本直接输出更动态的内容,也许cout并不是合适的工具。 - jalf
std::cout不会默认将输出发送到终端。有一些库可以理解适当的控制序列,以允许您显式地操作光标位置(例如ncurses)。对于简单的一次性应用程序,只需要使用'\r'进行简单的输出即可。 - Martin York
3个回答

13

这对我有效:

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

\r 是回车符号。它将光标移回到行的开头。

或者,您可以使用\b字符。这是退格键。打印时它会向后移动一个字符位置。


你有3个\r(回车)比实际需要的多(除非你想要\b,退格)。 - Hasturkun
正确的行尾符号是"\n",而不是"\r"。标准库将把"\n"解释为CR-LF、LF-CR或适合您平台的其他格式。还有std::endl,它会额外强制刷新缓冲区。 - Gene Bushuyev
@Gene Bushuyev:你在说什么?OP要求使用退格或回车来覆盖先前的输出。 - detunized
@Gene: \r是换行符,\n是新行。OP正在询问的是如何覆盖已经在控制台上的数据,而不是如何向其添加新行。 \r将强制光标返回到当前行的开头(未来输出将覆盖先前的内容)。 \b将擦除控制台上的最后一个字符,未来的输出将替换它。这正是OP所要求的。 - Zac Howland
@Gene Bushuyev:不完全正确。文件的iostream(cin/cout是文件流的类型)会将'\n'转换为/从平台相关的行尾序列。@detunized '\r'的解释取决于终端的使用情况。要获得终端无关的光标移动,您需要使用一个适当的库,该库了解终端控制序列。但是说'\r'应该在大多数地方工作,并且可能足以满足OP的需求。 - Martin York

2
一般情况下是不可能的。(想象一下从cout输出直接传送给打印机。你如何指示它"取消打印"最后一行?) cout是一个输出流,它不会对输出发送的媒介或其能力做出任何假设。特定技巧可以在某些情况下实现你想要的效果,但在其他情况下会失败得非常惨。如果你想要比纯文本直接输出更加动态的内容,也许cout并不是使用的正确工具。

0

从cout中肯定无法获取终端行长度。由于这可以更改,因此您可能会使用过长的行,这将导致每次更新都打印新行(使用'\r')。如果要使用特定平台,则使用特定于平台的函数来获取终端大小(请注意,您可能根本没有连接到任何终端,例如重定向到文件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接