【C#】控制台输出中\r和\r\n的区别
今天在用程序收发数据的时候,发现接收的数据首行未在控制台中输出,但是日志中记录的是完整的,查看日志,发现输出的文本中夹杂着一个 \r
,当时很奇怪,为什么没有换到下一行输出,而是这 \r
前的文本 "不见了"?
后来查了查,发现 \r
和\r
\n
还是有区别的,\r
和 \n
分别代表回车(Carriage Return)和换行(Newline)字符
\n
(Newline):将光标移动到下一行的开始位置。\r
(Carriage Return):将光标的水平位置移回到当前行的开始位置,但垂直位置不变。
当使用 aaaa\r\nbbbb
输出时:
- 首先输出
aaaa
。 \r
将光标移回到行首,但这不会擦除已有的文本。\n
将光标移到下一行的开始位置。- 接着输出
bbbb
,在新的一行。
因此,你会看到:
aaaa
bbbb
而当使用 aaaa\rbbbb
输出时:
- 首先输出
aaaa
。 \r
将光标移回到行首,此时光标位于aaaa
的前面。- 然后输出
bbbb
,因为光标在行首,bbbb
会覆盖掉原来的aaaa
。
因此,最终你会只看到:
bbbb
这是因为 bbbb
覆盖了原先 aaaa
所在的位置,而没有换行发生,所以屏幕上只显示了 bbbb
。所以,看起来就感觉是 \r
前面的文本 "消失了"!
这种技术常用于更新控制台中的进度条或者动态更新某一行的文本,因为不需要输出整个新行,而是原地替换文本。
最后我们来验证一下,这次我们输出aaaa\rbbb
这个字符串比上面的文本少一个字节,最后输出为:
bbba
果然,前面三个字节被新字节替换,后面的第四字节依旧保留。