【C#】控制台输出中\r和\r\n的区别

今天在用程序收发数据的时候,发现接收的数据首行未在控制台中输出,但是日志中记录的是完整的,查看日志,发现输出的文本中夹杂着一个 \r ,当时很奇怪,为什么没有换到下一行输出,而是这 \r 前的文本 "不见了"?

后来查了查,发现 \r 和\r\n 还是有区别的,\r\n 分别代表回车(Carriage Return)和换行(Newline)字符

  • \n (Newline):将光标移动到下一行的开始位置。
  • \r (Carriage Return):将光标的水平位置移回到当前行的开始位置,但垂直位置不变。

当使用 aaaa\r\nbbbb 输出时:

  1. 首先输出 aaaa
  2. \r 将光标移回到行首,但这不会擦除已有的文本。
  3. \n 将光标移到下一行的开始位置。
  4. 接着输出 bbbb,在新的一行。

因此,你会看到:

aaaa
bbbb

而当使用 aaaa\rbbbb 输出时:

  1. 首先输出 aaaa
  2. \r 将光标移回到行首,此时光标位于 aaaa 的前面。
  3. 然后输出 bbbb,因为光标在行首,bbbb 会覆盖掉原来的 aaaa

因此,最终你会只看到:

bbbb

这是因为 bbbb 覆盖了原先 aaaa 所在的位置,而没有换行发生,所以屏幕上只显示了 bbbb。所以,看起来就感觉是 \r 前面的文本 "消失了"!

这种技术常用于更新控制台中的进度条或者动态更新某一行的文本,因为不需要输出整个新行,而是原地替换文本。

最后我们来验证一下,这次我们输出aaaa\rbbb 

这个字符串比上面的文本少一个字节,最后输出为:

bbba

果然,前面三个字节被新字节替换,后面的第四字节依旧保留。

 

posted @ 2024-06-27 14:46  高正兴  阅读(8)  评论(0编辑  收藏  举报