问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

不同系统换行符差异导致的文本读取问题及解决方案

创作时间:
作者:
@小白创作中心

不同系统换行符差异导致的文本读取问题及解决方案

引用
CSDN
1.
https://blog.csdn.net/Beihai_Van/article/details/137437559

在跨平台开发中,不同操作系统对换行符的处理方式存在差异,这可能导致文本读取和显示出现意想不到的问题。本文通过一个具体案例,详细解析了Windows和Linux系统中换行符的差异,并提供了实用的解决方案,帮助开发者避免此类问题。

1 问题现象描述

起因是群友问了这么一个问题

确实很奇怪,按理说第二个printf不会完全不输出,于是想到,会不会是printf缓冲器的锅,让群友尝试刷新缓冲区,无果。

2 解决过程

于是我将代码克隆到本地的win环境运行,却发现输出正常:

这就很奇怪了,我的环境运行正常,而群友运行就不正常,开始怀疑是不是其环境的问题。

此时,注意到其用的是 WSL 的 Ubuntu 环境,于是我尝试在我的 WSL 的 Ubuntu 环境下运行,结果问题真的复现了!

3 原因解释

丢给gpt进行解释,原来我们忽略了一个重要的问题:不同系统的回车换行符是不同的

系统
换行符
Windows
\r\n
UNIX、Linux
\n
macOS
\r

Linux会将连一起的\r\n解释会回车换行,\n也会解释为回车换行,但是如果\r不和\n一起出现,\r将被解释为回车符,也就是光标回到当前这个 printf 输出的内容的开始,如果后面继续输出,将会覆盖当前这个 printf 输出的内容。

  • 如图,\r\n被linux解释为回车换行:
  • 单独的\n也被 linux 解释为回车换行
  • 而单独的\r被 linux 解释为回车,输出 bb 后,由于光标回到了第一个 b,下次输出的 c 直接覆盖了第一个 b

4 如何避免踩坑

在处理文本文件时,应确保文件格式符合当前系统的要求。

4.1 格式转换

  • 如果在 Linux 中,可以使用命令行命令对文件进行格式转换:
# 将UNIX / Linux格式的文件转换为DOS格式
unix2dos 文件名
# 将DOS格式的文件转换为UNIX / Linux格式
dos2unix 文件名

4.2 格式查看

cat -A 文件名
  • aaaa^M$表示文件中存在以下内容:
  • aaaa是4个 ‘a’ 字符
  • ^M表示一个 Windows 风格的回车符 (Carriage Return)
  • $表示一个 Unix 风格的换行符 (Newline)

这说明该文件使用了 Windows 风格的换行符,而不是 Unix/Linux 的换行符 (\n)。为了在 Unix/Linux 系统上正确显示该文件,需要使用dos2unix命令将其转换为 Unix 格式。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号