在DB ++中使用带有endl和\ n的退格键

时间:2016-09-28 13:35:33

标签: c++ escaping backspace

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

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

所以,这个程序给出了所需的输出Hello World。这不应该发生,因为退格只会将光标向后移动一个空格而不是从缓冲区中删除它。那么,为什么不打印!? / p>

现在,考虑另一个程序 -

#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刷新缓冲区。那么,在两种情况下输出是如何相同的?

1 个答案:

答案 0 :(得分:-1)

我假设你的第一个程序的输出看起来像这样吗?

$ ./hello
Hello World$ 

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

关于第二个程序,当刷新缓冲区时,只会影响\b发送到终端的时间,而不会影响它的处理方式。 \b是流的一部分,终端碰巧将此解释为&#34;备份一列&#34;。如果不清楚,请查看发送到 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,因此在此示例中是否通过\nendl并不重要。实际上,由于 stdout 连接到终端,\n可能会刷新。