记得大一时,C语言老师就说过回车、换行,但都没说得那么细。前两天,看写两句Perl代码时,忽然想起区别一下回车和换行(\r和\n)。现在理解清楚了,记个笔记吧。
符号 ASCII码 意义
\n 10 换行NL
\r 13 回车CR
回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return
换行 \n 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成LF,即Line Feed
在不同的 操作系统 这几个字符表现不同,比如在WIN系统下,这两个字符就是表现的本义,在UNIX类系统,换行\n就表现为光标下一行并回到行首,在MAC上,\r就表现为回到本行开头并往下一行,至于ENTER键的定义是与操作系统有关的。通常用的Enter是两个加起来。
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
/*======================================*/
\n: UNIX 系统行末结束符
\n\r: window 系统行末结束符
\r: MAC OS 系统行末结束符
/*======================================*/
一个直接后果是,Unix/Mac系统下的文件在 Windows 里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。(这也是经常说见到的现象,哈哈,原来是这样的)
上面是文件中的换行表示,下面是编程中的表示;
c++语言编程时(windows系统)\r 就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉如:
int main() {
cout << "hahaha" << "\r" << "xixi" ;
}
输出为xixi
最后只显示 xixi 而 hahaha 被覆盖了\n 是回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉(可以认为编程时是这样)
int main() {
cout << "hahaha" << "\n" << "xixi" ;
}
则 显示
hahaha
xixi
二进制和文本模式的区别
1.在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。而在二进制情况下,换行请写入"\r\n";
2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。
打开方式总结:各种打开方式主要有三个方面的区别:
①打开是否为二进制文件,用“b”标识。
②读写的方式,有以下几种:只读、只写、读写、追加只写、追加读写这几种方式。
③对文件是否必 须存在、以及存在时是清空还是追加会有不同的响应。具体判断如下图。
在 C 或 C++ 语言中,换行就是用换行符 '\n' 来表示的。至于换行在文件中的表现形式则取决于系统。而当向文件写入换行时,函数可能会进行一些特殊的操作(如上红字);
来源:
(1)、http://www.cnblogs.com/clarkchen/archive/2011/06/02/2068609.html
(2)、http://baike.baidu.com/link?url=ESr3s3cewRW3CIUha75BuBPJrbNbH0LnnY1SAQ5YJL2CBurU3srMYKZ4zxmj38VJSEyhEQFS2jfR9ao1qtrerK
(3)、http://blog.csdn.net/fdl19881/article/details/7327106
(4)、http://bbs.chinaunix.net/thread-829984-1-1.html