现在的位置: 首页 > 综合 > 正文

文本模式读写文件中\r和\n的问题

2018年10月15日 ⁄ 综合 ⁄ 共 1049字 ⁄ 字号 评论关闭

原文地址:http://blog.sina.com.cn/s/blog_65db99840100kidc.html

DOS文件(windows格式文件)中,按一下ENTER就是输入了\r\n,这就是回车换行

MAC文件里,用\r换行

UNIX文件里,用\n换行

自己尝试了一些\r \n的组合,归纳了下规律:

windows下用文本方式文件时

缓冲区里的\n或者\r都会被自动替换为\r\n写入文件,即使是连着的\r\n,也会被替换成\r\n\r\n(但是msdn上面只说\r被替换为\r\n,我的前面一篇博文里有原文)

windows下用文本方式文件时

文件中的\r\n自动替换为\n存放到缓冲区里(这点和msdn是符合的,前面的博文里有原文)

\r不会被替换

 

假设要读取的文件流长度小于缓冲区长度

如果用fread文本模式读文件,\r\n被替换为\n读进缓存区里

如果是fgets文本模式读文件,碰到第一个\n(这里的\r和\n都是指经过转换后读入缓冲区的,即\r\n被替换为\n)后停止读取,缓存区里存放的是\n之前的字符串(包括这个\n以及之前所有的\r)

 

fread和fwrite的返回值问题

文本模式写文件时,\n或\r自动替换成\r\n,但是fwrite的返回值里还是算写了一个字符(和msdn符合,前面一篇博文有原文)

文本模式读文件时,\r\n被自动替换为\n,但是也算是读了一个字符(和msdn的不一样,msdn是说算读了2个,前面的博文里有原文)

 

如果用UltraEdit打开文本文件有时候会碰到询问你是否要转换为DOS文件,其实就是回车换行符的问题了。做了如下表的尝试,但是规律不太好总结啊。

 

要写入的字符

实际写入的字符(即\n被替换为\r\n后)

Ultraedit转换为DOS格式后的文件内的实际字符

\r

\r

\r\n

\n

\r\n

未提示转换为DOS文件

\r\n

\r\r\n

\r\n

\n\r

\r\n\r

未提示转换为DOS文件

\n\r\n

\r\n\r\r\n

\r\n\r\n

\n\r\n\r

\r\n\r\r\n\r

\r\n\r\n

\n\r\n\n\r

\r\n\r\r\n\r\n\r

\r\n\r\n\r\n\r\n

\r\r\n\n

\r\r\r\n\r\n

\r\n\r\n\r\n

\r\r\r\n\r\n

\r\r\r\r\n\r\r\n

\r\n\r\n\r\n\r\n

\n\r\r

\r\n\r\r

\r\n\r\n\r\n

\n\r\r\r\r

\r\n\r\r\r\r

\r\n\r\n\r\n\r\n\r\n

抱歉!评论已关闭.