我编写了一个小型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
刷新缓冲区。那么,在两种情况下输出是如何相同的?
答案 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
(分别为08
和0a
),与您在程序中写入cout
的内容相匹配。
最后,当程序退出时会刷新cout
,因此在此示例中是否通过\n
或endl
并不重要。实际上,由于 stdout 连接到终端,\n
可能会刷新。