赞
踩
拿同事的一个windows下的C程序,在Linux下跑,结果不正确。定位为读取.ini配置文件错误。该配置文件是在windows下编辑的,网上查到资料,说是windows和linux下对换行符处理不同导致的。
博客https://blog.csdn.net/stpeace/article/details/45767245说的很详细,主要意思是如下:
Windows系统中有如下等价关系:
用enter换行 <====> 程序写\n <====> 真正朝文件中写\r\n(0x0d0x0a) <====>程序真正读取的是\n
linux系统中的等价关系:
用enter换行 <====> 程序写\n <====> 真正朝文件中写\n(0x0a) <====> 程序真正读取的是\n
所以,在windows下编辑的ini文件,换行符是\r\n,拷贝到linux下时,同事的程序按照windows中的处理方式,将\n识别为换行符,\r识别为正常字符。导致程序执行错误。
可以通过修改程序解决,也可以将ini文件由dos格式转换为unix格式后(去掉多余的\r)再使用。我为了省事,将文件由dos格式转换成了unix格式。
转换方式有很多种,参见博客https://blog.csdn.net/lovelovelovelovelo/article/details/79239068
我采用的是vim编辑方式,如下:
使用vi打开文本文件
vi dos.txt
命令模式下输入
:set fileformat=unix
:w
:q
==============================================================================================
博客https://blog.csdn.net/stpeace/article/details/45767245的内容:
多数程序员都会在不经意间遇到下面这两个问题:
1. linux上用vim写的文件test.txt拷贝到windows上, 结果所有的内容都显示在一行中。(当然, 如果你Windows上的编辑显示器够智能, 那就是另外一回事了)
2. Windows上建立的test.txt拷贝到linux上, 结果linux程序运行异常。(当然, 如果你的linux程序足够健壮, 那就没有问题了)
ps. 当你在Windows上写好linux shell script, 拷贝到linux下运行, 就会出问题。
为什么会出现上面的问题呢? 这就需要我们了解\r\n和\n了。
我们先以Windows为例来说明。 我们来新建一个dos.txt文件, 然后在第一行敲一下enter键, 然后保存文件。 此时, 我们查一下这个文件的大小, 结果发现是2个字节(而不是1个), 用UltraEdit查阅一下, 就知道文件中的两个字节是0x0d和0x0a, 也就是\r和\n. 但是, 如果用C程序来读取dos.txt文件, 发现又根本没有读取到\r, 这是怎么回事呢? 原来: 在Windows上的dos.txt文件中, 按一下enter键, 实际上就相当于C程序写\n字符,而由于历史原因, 写文件的时候, Windows系统会自动在\n前面加上\r, 这样, dos.txt文件中就有了\r\n了, 在读取的时候, Windows系统会自动去掉\r, 所以你的C程序根本读不读\r, 还是\n.
实话实说, 我发现很多地方讲\r\n和\n, 都说得不太清楚, 下面我来说一下, 希望是更清楚, 而不是更模糊:
Windows系统中有如下等价关系:
用enter换行 <====> 程序写\n <====> 真正朝文件中写\r\n(0x0d0x0a) <====>程序真正读取的是\n
linux系统中的等价关系:
用enter换行 <====> 程序写\n <====> 真正朝文件中写\n(0x0a) <====> 程序真正读取的是\n
现在, 我们看看本文开头部分的问题。 假设有一个linux下的unix.txt文件, 那么, 它在文件中的换行标志是:\n, 现在把unix.txt拷贝靠Windows上, 那好啊, Windows那双犀利的眼神仿佛是在对unix.txt文件说: 别跟我整什么\n, 我只认识文件中的\r\n, 如果你这个unix.txt文件里面有\r\n, 那我就认为是换行符, 否则, 我不认你。 如此一来, Windows压根就找不到unix.txt中的\r\n, 所以, 对于Windows而言, 压根就没有发现unix.txt有任何换行, 所以, 我们从Windows上看到的unix.txt文件显示在一行里面。
同理, 假设Windows上有一个dos.txt文件, 那么, 它在文件中的换行标志是\r\n, 现在拷贝到linux下, 那好啊, 正如linus一样, linux这个倔强的家伙貌似在说: 别的我不管, 我遇到文件中的\n, 我就认为是换行, 至于其他的, 我只认为是正常的字符。 如此一来, \r就被当成了文件的正常部分, 也就是说, linux下的C程序不仅仅会读取到\n, 也会读取到它前面的\r.
实际上Windows上的文件是dos格式的, 而linux上的文件是unix格式的, 我们可以通过linux上的dos2unix和unix2dos来实现转化, 当然, 有的linux环境下, 需要用busybox dos2unix和busybox unix2dos.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。