如何移除放入std::cout的最后一个字符?

40

在不使用WinAPI的情况下,Windows是否可以实现这一点?

4个回答

98

您不能删除最后一个字符。

但是您可以通过覆盖最后一个字符来实现类似的效果。 为此,您需要通过输出'\b'(退格)字符将控制台光标向后移动,如下所示。

#include<iostream>
using namespace std;
int main()
{
    cout<<"Hi";
    cout<<'\b';  //Cursor moves 1 position backwards
    cout<<" ";   //Overwrites letter 'i' with space
}

那么输出将会是

H


6
你必须小心,确保在插入退格键之前,cout没有决定自行flush输出缓冲区。 - rubenvb
3
用这种方法似乎无法删除一个新行。 - trusktr
1
使用退格符实际上是跨平台的,因为我已经在 Linux 上测试过它,并且它有效。要创建“控制台动画”,比如进度条,首先需要在主函数的开头添加以下代码来禁用 std::cout 的缓冲:std::cout << unitbuf; 现在,打印一个 '\b' 将会从真实的控制台中删除一个字符,而不是从 std::cout 内部缓冲中删除一个字符。我不知道当缓冲开启时,std::cout 是否会缓冲 '\b' 或者是否会将其解释并从其内部缓冲区中删除一个字符。 - Hatoru Hansou
2
然而,如果您将输出重定向到文件,则^H和前面的字符仍将存在于那里。 - Wojciech Migda
只能在终端上运行。如果输出到管道或文件,会出错。不建议使用。 - undefined

9
这段代码恰恰实现了这一点:
std::cout<<"\b \b";

3
如果您使用stringstream并将其与其他字符串进行比较,那么它们将不匹配。这仅适用于在终端打印时。 - tjysdsg
1
编辑:哦,所以你在向后移动,写一个空格,然后再向后移动。 - Andrew

3
您也可以使用 cin.get() 来删除最后一个字符。

3

不行。

如果没有访问控制台 API,您将无法进行此操作。但是这种 API 通常并不标准化。


1
抱歉,您可以查看我的答案。 - Hassen Dhia

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