`
kakajw
  • 浏览: 265320 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

详解文本读写时主流操作系统平台换行符和回车符差异

阅读更多

1  字符定义

ASCII码  符号  字符缩写(全称)                中文名称

13          \r       CR (carriage return)             回车

10          \n      LF (NL line feed, new line)    换行

 

CR:本义是光标定位到行首(本行),即Carriage Return,\r,n表示return

LF:本义是光标跳至下一行(不一定是下一行行首),即Line Feed,\n,n表示newline

 

假设定义

换行+回车:表示光标跳到下一行行首。

对于WINDOWS/UNIX/Linux等主流操作系统,在文本读写时,键盘的回车键(Enter键)等同于:换行+回车。

 

 

2 差异测试

文本读写时,\r和\n在各主流操作系统的差异:

 

WINDOWS系统: \r\n表示换行+回车

例1:

假如通过程序向文件test.txt从首行写入字符序列:\naaa\r\nbb\nb\rccc

那么,通过程序按字符的ascii码读取文本内容的结果:1097979713109898109813999999

使用记事本打开test.txt,文本内容如下:

aaa

bbbccc(此处为光标终点位置)

可见,Windows系统\r\n表示回车+换行,单独的\r或\n在记事本中的显示为不占位的空字符串,不会控制光标的移动。

 

例2:

假如通过程序向文件test.txt从首行写入字符序列:\naaa\r\nbb\nb\rccc\r

那么,通过程序按字符的ascii码读取文本内容的结果:109797971310989810981399999913

使用记事本打开test.txt,文本内容如下:

aaa

bbbccc(此处为光标终点位置)

可见,\r始终显示为不占位的空字符串,无论是在文本的末尾或中间。

 

例3:

假如通过程序向文件test.txt从首行写入字符序列:\naaa\r\nbb\nb\rccc\n

那么,通过程序按字符的ascii码读取文本内容的结果:109797971310989810981399999910

使用记事本打开test.txt,文本内容如下:

aaa

bbbccc

(此处为光标终点位置)

可见,对于win的记事本,当\n在文本末尾时,光标跳到了下一行行首(回车+换行),而文本中间的\n不会。

 

总结

a.Windows平台,\r\n表示换行+回车

b.单独\r仅表示不占位的ASCII字符(空字符),不控制光标的移动;

c.单独\n仅表示不占位的ASCII字符(空字符),不控制光标的移动;

但当\n位于文本内容的末尾时,对于win的记事本,光标会跳到下一行行首,否则\n不控制光标的移动,求大神解释原因!

 

 

UNIX和Linux系统:  \n表示换行+回车

例1:

假如通过程序向文件test从首行写入字符序列:aaa\n\rbbb\rccc

那么,通过程序按字符的ascii码读取文本内容的结果:979797101398989813999999

[root@localhost opt]vi test

aaa

^Mbbb^Mccc

~

[root@localhost opt]cat test

aaa

ccc[root@localhost opt]# 

可见,\n代表回车+换行,\r在Linux文本编辑器显示为^M,\r在Linux文件读取命令cat控制光标移到到本行行首(本义)

 

例2:

假如在例1字符序列后追加一个\n

通过程序向文件test从首行写入字符序列:aaa\n\rbbb\rccc\n

那么,通过程序按字符ascii码读取文本内容的结果:97979710139898981399999910

[root@localhost opt]vi test

aaa

^Mbbb^Mccc

~

说明:对于vi,\n也是换行+回车, 但在字符序列末尾为时,因vi光标显示问题,效果不明显,导致看似和例1一样

[root@localhost opt]cat test

aaa

ccc

[root@localhost opt]# 

 

例3:

假如在例2字符序列后再追加一个\n

通过程序向文件test从首行写入字符序列:aaa\n\rbbb\rccc\n\n

那么,通过程序按字符ascii码读取文本内容的结果:9797971013989898139999991010

[root@localhost opt]vi test

aaa

^Mbbb^Mccc

 

~

[root@localhost opt]# cat test 

aaa

ccc

 

[root@localhost opt]# 

 

总结

a.Linux系统中,\n表示换行+回车

b.对于Linux的文本编辑器vi,\r显示为^M

c.对于Linux的文本读取和显示命令cat,\r控制光标移动到行首(较好地诠释了\r的意义)

 

MAC:  \r表示换行+回车

mac系统没有做相关测试,有兴趣的可以自己测试。

 

 

3 字符历史(引用)

在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

 

/*======================================*/

\n:  UNIX 系统行末结束符

\r\n: window 系统行末结束符

\r:  MAC OS 系统行末结束符

/*======================================*/

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。(这也是经常说见到的现象,哈哈,原来是这样的)

 

c++语言编程时(windows系统)\r 就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉

如:

int main() {

cout << "hahaha" << "\r" << "xixi" ;

}

 

最后只显示 xixi 而 hahaha 被覆盖了

\n 是回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉

int main() {

cout << "hahaha" << "\n" << "xixi" ;

}

则 显示

hahaha

xixi

分享到:
评论

相关推荐

    CStdioFile的用法

    - 文本模式和二进制模式在处理回车换行符时有显著差异,确保在读写文件时选择正确的模式。 总之,CStdioFile为MFC应用程序提供了方便的文本文件读写功能,通过继承自CFile并扩展其功能,使得开发者能够更轻松地处理...

    C语言教学+文件.ppt

    文件的开始和结束由程序控制,而不是依赖于特定的物理符号,如回车换行符。因此,C语言中的文件被称为流式文件,允许灵活地处理单个字符或字节。 在早期的C语言实现中,如在UNIX系统下,文件操作有两种模式:缓冲...

    C语言中的输入输出函数

    - 在**MS-DOS**系统中,文本行以一个回车符和一个换行符结尾。 - 在**UNIX**系统中,仅使用一个换行符结尾。 **标准文本行**定义为零个或多个字符,后面跟一个表示结束的换行符。 #### 四、二进制流 **二进制流...

    Vim中特殊字符的读写详解

    要将Windows风格的换行符转换为Unix风格的换行符,只需执行以下操作: ```vim :set fileformat=unix :w ``` #### 六、搜索与替换特殊字符 在Vim中替换特殊字符时需要注意,应当使用`\r`而不是`\n`。例如,要将所有...

    IAR常见错误详解IAR常见错误列表

    这是因为文件结尾没有换行符,解决方法是在最后一行多加一个回车符。 6. 串口程序中断向量未定义 undefined external“UART1_ISR”referred in startup。 这是因为串口1中断向量没有定义,解决方法是定义串口1...

    C++初学者指南 第十一篇

    文本流处理字符数据,在输入输出过程中可能会进行字符转换,例如将换行符转换为特定的回车换行序列;而二进制流则原样处理数据,保持数据的完整性,不会进行额外的字符转换。 #### 当前位置与流操作 在流操作中,...

    C C++文件流介绍

    而文本模式主要用于处理格式化文本,其特殊之处在于,程序在读写时会自动转换文件中的回车和换行符,使之符合C/C++语言的规范,这一转换过程与操作系统平台相关。 #### C语言的文件操作 在C语言中,文件操作紧密...

    2013年山东专升本计算机考试真题.pdf

    以上是针对2013年山东专升本计算机考试真题中涉及的计算机基础知识进行的详细解释,涵盖了计算机系统的基础、操作系统、文字处理软件(Word 2003)以及电子表格软件(Excel 2003)的操作和应用。这些知识点对于理解...

    2023年电大远程网络教育计算机应用基础统考题库真题最新资料.doc

    涵盖了计算机历史、计算机组成、多媒体、信息理论、计算机分类、内存与外存的区别、软件概念、个人计算机配置、操作系统、文件管理、文本编辑软件(如Word)和演示文稿软件(如PowerPoint)的使用等多个方面。...

    2023年电大远程网络教育计算机应用基础统考题库真题资料.doc

    17. Windows命令提示符退出:在命令提示符下,键入Exit并回车可返回到Windows桌面。 18. Windows窗口概念:屏幕上可以出现多个窗口,只有一个活动窗口。 19. 树形目录结构:在文献系统的树形目录中,从根目录到...

    Python rstrip()方法实例详解

    如果未提供此参数,则默认移除所有的空白字符,包括空格、制表符(\t)、换行符(\n)和回车符(\r)。 **返回值** `rstrip()`方法返回一个新的字符串,它是原字符串去掉末尾指定字符后的结果。原字符串不会被改变...

    linux的IO编程(高清PDF带书签版)

    在Windows环境下,对回车键的处理有所不同,ASCII文件在输入时识别`\n`,但在输出时会将其转换为`\r\n`,而二进制文件则不会进行此类转换。相比之下,Linux并不区分ASCII码文件和二进制文件,所有文件均按普通文件...

    python 读txt文件,按‘,’分割每行数据操作

    注意,`line[:-1]`是为了去除末尾的换行符,因为`readlines()`返回的每行字符串末尾都有一个换行符`\n`。例如: ```python print(line[:-1].split(',')) ``` 4. **列表生成器**: 列表生成器是一种简洁的创建...

    Matlab GUI资料

    - **终止符**:用于表示数据包结束的特殊字符,常见于ASCII码中的回车换行符等。 ##### 二、Matlab中的串口通信 - **创建串口对象**: ```matlab pic = serial('COM1','BaudRate',19200,'Terminator',10); ``` ...

    山东专升本计算机考试真题.pdf

    14. Word中的回车键:在Word 2003中,按回车键会产生一个段落标记符(B)。 15. 表格操作:光标位于表格外右侧的行尾处,按Enter键会插入一行,表格行数改变(C)。 16. 字体对话框设置:在Word 2003的“字体”...

    杭州ACM集训队资料集

    - **输入输出处理**:如`cin`与`getline`的区别,`cin`不读取回车符,可能导致下一次`getline`读取错误;以及如何处理一行中多个不定数量的输入。 - **特殊指令**:如样例输入中使用“-1”表示输入结束,但在实际...

    计算机等级二级考试中delphi函数参考大全.pdf

    5. `adjustlinebreaks`函数:调整字符串中的行分隔符,使其符合标准的回车/换行符序列。 6. `align`属性:设置控件在窗口中的对齐方式,可以是左对齐、居中、右对齐或顶部、中部、底部对齐。 7. `alignment`属性:...

    cmake之file命令:文件处理命令

    CMake 是一个跨平台的自动化构建系统工具,主要用于管理构建过程。在 CMake 中,`file` 命令是用于执行文件系统操作的重要工具之一,它提供了丰富的功能来处理文件读取、写入、复制以及文件系统的其他操作。 #### 1...

Global site tag (gtag.js) - Google Analytics