我编写了一个小型C++程序来了解\b的用法。该程序如下-

#include <iostream>
using namespace std;
int main(){
    cout << "Hello World!" << "\b";
    return 0;
}

因此,此程序将提供所需的输出Hello World。这不会发生,因为退格仅将光标向后移动一个空格,而不是将其从缓冲区中删除。那么,为什么不打印!

现在,考虑另一个程序-
#include <iostream>
using namespace std;
int main(){
    cout << "Hello World!" << "\b";
    cout << "\nAnother Line\n";
    return 0;
}

所以,这里的输出是-Hello World!Another Line为什么退格键在这里不起作用?换行符不应刷新缓冲区,因此应删除!。这是什么问题?

另外,当我在endl之后添加\n\b时,在两种情况下,输出都是Hello World!。但是,换行符不会刷新缓冲区,而endl会刷新缓冲区。那么,两种情况下的输出如何相同?

最佳答案

我认为您第一个程序的输出看起来像这样吗?

$ ./hello
Hello World$

如果是这样,就不会从缓冲区中删除!;当 shell 打印提示时,它将被破坏。

对于第二个程序,何时刷新缓冲区仅影响\b发送至终端的时间,而不影响其处理方式。 \b是流的一部分,终端碰巧将其解释为“备份一列”。如果不清楚,请查看发送到stdout的实际字节:
$ ./hello2 | hexdump -C
00000000  48 65 6c 6c 6f 20 57 6f  72 6c 64 21 08 0a 41 6e  |Hello World!..An|
00000010  6f 74 68 65 72 20 4c 69  6e 65 0a                 |other Line.|
0000001b
\b后跟\n(分别为080a),将您在程序中编写的内容与cout相匹配。

最后,在程序退出时会刷新cout,因此在此示例中传递\n还是endl都无关紧要。实际上,由于stdout连接到终端,因此\n可能仍会刷新。

09-10 00:20
查看更多