回车和换行

来源:互联网 发布:java遍历map集合 编辑:程序博客网 时间:2024/04/25 09:30

转自于 点击打开链接

   Unix/Linux和Windows回车换行

 
  Linux/Unix下的回车符与windows下的不同,Linux/unix下的回车符是'0d',而在windows下则是'0d0a',
 
据说这和电脑刚开始发展时的电传打印机的速度有关。
 
   在计算机还没有出现之前,有一种叫电传打字机(teletype model 33)的玩意,每秒钟可以打10个字
 
符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒的时间,正好可以打两个字符。要是在这
 
0.2秒内有字符传过来,就会丢失。
 
    于是,研究人员想了一个办法,解决这个问题。就是在每行后面加两个表示结束的字符。一个叫做“回
 
车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
 
    这就是“回车”和“换行”的来历,从它们的英语名上也可以看出一二。
 
    后来,计算机发明了,这丙个概念也就被搬到了计算机上。那时,存储器很贵,一些科学家认为在每行
 
结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
 
    Unix系统里,每行结尾只有“<换行>”,即“\n”;windows系统里,每行结尾是“<换行><回车>”,
 
即“\n\r”;mac系统里,每行结尾是“<回车>”。一个直接后果是,unix/mac系统下的文件在windows里打
 
开的话,所有文字会变成一行;而windows里的文件在unix/mac下打开的话,在每行的结尾可能会多出一个
 
^M 符号。
 
    c语言编程时(windows系统)
 
\r就是return回到本行行首  这就会把这一行以前的输出 覆盖掉  如下:
 
int main () {
cout << "hahaha" << "\r" << "xixi";
}
 
最后只会显示xixi而hahaha被覆盖了。
 
\n 是回车+换行  把光标先移到行首,然后换行到下一行,也就是下一行的行首位:
 
init main () {
cout << "hahaha" << "\n" << "xixi";
}
 
 
 
    为什么我在vi等编辑器下打开一个文本文件会包含 ^M,如何把它去掉呢?(见结论4,5)
 
    为什么我在windows上用记事本打开unix上的文件,文件都不换行?(见结论1)
 
    原因分析:
 
要解决这个问题,必先弄清unix与windows文本文件的差异:
 
1)磁盘中windows文本文件,总是以“回车”+“换行”的形式进行换行的。
 
2)磁盘中unix格式的文件,总是以“换行符”(即:LF,'n')换行,而非“回车换行符”。
 
(unix规定;unix文本文件保存到磁盘时,总是自动把“回车换行符”转换成“换行符”保存。)
 
输出到终端时,由终端自动将“换行符”转换成“回车换行符”输出。
 
容易看出来,windows格式的文件换行时,总是比unix格式的文件多一个“回车”(‘r’)符,这是从老式
 
的打字机上面遗传下来的,老式的打字机中的回车是指打印头回到行首,换行是指进纸并开始下一行的打印
 
 --------------------------------------  结论 1   -------------------------------------------
 
这样在windows的记事本中打开unix格式的文件时,因为文件中没有'r',所以无法正常显示,结果会把所有
 
的内容显示在同一行中。
 
 --------------------------------------- 结论 2   -------------------------------------------
 
utraedit等工具会自动检测文件中是否包含‘r’,当检查行缺少‘r’时,一般会提示,是否要进行unix到
 
windows的格式转换。(相信大家都遇到过这个提示信息吧)。
 
 ---------------------------------------- 结论 3   -------------------------------------------
 
utraedit和vi等工具,在保存文件时会自动依照文件原来格式进行保存。即:
 
如果打开的是windows格式,它会把文件依然按windows格式保存(不进行自动转换)。
 
如果打开的是unix格式,它会把文件依然按unix格式保存了(不进行自动转换)。
 
 ---------------------------------------- 结论 4   -------------------------------------------
 
向utraedit打开unix格式文件中,通过粘贴板“粘贴” windows格式的若干片断时(或反之,即向
 
windows格式文件时,通过粘贴板“粘贴”unix格式的若干片断行时),代码片断中的“回车换行符” “不
 
会”自动转换成单个“换行”符(反之亦然)。这样,该文件中就会出现“回车符”与“回车换行符”。
 
 ---------------------------------------- 结论 5   -------------------------------------------
 
vi编辑器等即能正确显示“规则”的unix格式文件,也能正确显示“规则”的windows格式文件,但对包含
 
单独的“回车符”,同时成对的“回车换行符”的不规则文件(产生原因见结论 4)。vi将把回车符以^M的
 
形式显示。
 
解决办法:
 
使用类似问题2提供的解决方法即可解决,不再赘述。将unix转换成windows格式时,使用unix2dos或win2unix -r(-r代表反方向)即可。
 
则显示:
hahaha
xixi
 
由于可见,如果Linux下应用程序需要读取windows下的文件,需要特殊的文本转换工具才行。比如
 
editplus2就是不错的工具。
 
补充:vi要显示所有字符,使用:set list命令。

 

原创粉丝点击