我编写了一个小型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
(分别为08
和0a
),将您在程序中编写的内容与cout
相匹配。最后,在程序退出时会刷新
cout
,因此在此示例中传递\n
还是endl
都无关紧要。实际上,由于stdout连接到终端,因此\n
可能仍会刷新。