Total Pageviews

Sunday, 3 July 2016

深入解析操作系统中的换行符

我们知道在Windows, Unix/Linux, Macintosh上的换行符是各不相同的。在Windows中使用CRLF表示换行,而Unix/Linux是LF,Macintosh是CR。 CR的值是0x0D,通常使用\r表示,LF的值是0x0A,通常使用\n表示。也就是说,Win中的换行使用\r\n,*nix使用\n,Mac使用\r。通常,\r叫做回车\n叫做换行
我们现在思考一个问题,当我们在Windows中使用C语言编程时,输出换行使用的都是\n,那么当写入到文件时,文件里存的是\n还是Windows的换行符\r\n呢?
可以肯定的是,写入的一定是\r\n,因为正常编程写出来一个不符合本操作系统换行的文本文件是不太合理的。
我经过研究和测试,得到了以下结论:
  • Windows在读取字符时(例如getchar()),会将\r\n作为一个整体读入,即当\r之后存在\n时,会吃进这两个字符并返回一个\n字符。若存进字符串,字符串中存储的也是\n
  • Windows在输出字符时(例如putchar(), printf(), puts()),要输出\n时,会输出\r\n两个字符。
  • 在*nix和Mac中,\r就是\r\n就是\n,作为两个独立的字符处理。
  • 在Windows中,gets函数遇到\r\n\n时会停止输入,遇到\r时继续输入。而*nix只在遇到\n时才会停止输入。
  • 在所有系统中,由于scanf函数遇到空白字符都会停止输入,因此在遇到\r\n时都会停止输入。
  • 若在控制台中输出\r,则\r表现为移动光标到行首,若继续输出其他字符,则先前在本行输出的字符可能会被覆盖。
其实仔细思考一下,只要抓住Windows的换行符是\r\n这一点,以上结论还是可以很容易得出的。
不过,为何不同操作系统要使用不同的换行方式,这就不得而知了。
另外,上述内容只是针对C/C++所说,其他语言是不一定的,例如PHP,\r就是,\n就是\n。在写Windows中的文件时,想要输出换行,必须输出\r\n才行。
PS: 现在的OS X换行符已经改为LF,与*nix一致.