这里主要涉及对于回车换行的讨论。

回车:\r

换行:\n

Windows读写文件分为普通文件读写和二进制文件读写。

如果以二进制的方式读写文件(如rb, wb),将会完全的把文件内容读出来,不做任何处理。

而如果以普通方式读写文件,会对文件做一些处理,而我所了解的只有一点,就是对回车符与换行符的处理。

首先我建了4个文件:r.txt     n.txt     rn.txt      nr.txt

r.txt的内容:hello\rworld(注'\r'表示一个字符,回车符)

n.txt的内容:hello\nworld(注'\n'表示一个字符,换行符)

rn.txt的内容:hello\r\nworld(注'\r\n'表示两个字符,回车符和换行符)

nr.txt的内容:hello\n\rworld(注'\n\r'表示两个字符,换行符和回车符)

然后,我用普通方式读文件 fp = fopen(name, "r");

r.txt中读到的内容:hello\rworld,没变

n.txt中读到的内容:hello\nworld,没变

rn.txt中读到的内容:hello\nworld,改变了,少了'\r'

nr.txt中读到的内容:hello\n\rworld,没变

得出结论:在以普通方式读取文件时,Windows只对'\r\n'(注意是连续的两个字符,而且就是这个顺序)做处理,

处理的结果是撇掉'\r'只留一个'\n'。

然后,我又把四个文件都清空,用普通方式写文件 fp = fopen(name, "w");

r.txt:fprintf(fp, "hello\rworld");

n.txt:fprintf(fp, "hello\nworld");

rn.txt:fprintf(fp, "hello\r\nworld");

nr.txt:fprintf(fp, "hello\n\rworld");

最后我用文本编辑器(SublimeText)以十六进制形式查看这四个文件,

r.txt中实际写入的内容:hello\rworld,没变

n.txt中实际写入的内容:hello\r\nworld,'\n'被扩展成了'\r\n'

rn.txt中实际写入的内容:hello\r\r\nworld,'\n'被扩展成了'\r\n'

nr.txt中实际写入的内容:hello\r\n\rworld,'\n'被扩展成了'\r\n'

得出结论:在以普通方式写文件时,Windows自动将'\n'字符扩展成'\r\n',

所以如果你这时再以fprintf(fp, "hello\r\nworld");这种方式向文件中写数据,就会多写一个'\r',

虽然'\r'是不可打印字符,我们看不见,但它确实被写到文件中了,而且有些编辑器会检测到这个多出来的'\r',

从而以特别的方式显示出来,很是有碍观瞻。现在知道了原理,相信你也能很轻松的解决这种问题了。

补充:由于历史原因,Windows,linux,Mac OS三大平台对于换行的表示(这里说的是在文本文件中的表示)很不统一,

Windows的正规表示法是'\r\n',即用回车符+换行符来表示换行,

Linux的表示则比较简洁,只用一个'\n'换行符就够了,

Mac也很简洁,但它是用一个'\r'回车符来表示换行。

好在代码编辑器都比较智能(如SublimeText),对这三种换行形式都能正确地识别出来。

Windows读写文件的猫腻的更多相关文章

  1. ubuntu samba共享后windows读写文件都是以nogroup问题

    添加smb账号 sudo smbpasswd -a xxx 如果报错:Failed to add entry for user xxx 则是因为这个账号不存在 添加成功以后,过一会就可以重新登陆了(u ...

  2. Python读写文件

    Python读写文件1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('t ...

  3. Inno Setup 如何读写文件

    软件安装的实质就是拷贝,对于简单的打包当然不需要考虑修改某(配置)文件.通过inno修改文件的目的在于把安装时相关信息写入文件中,提供其它应用的读取,而这些信息也只能在安装时才能确定,比如安装用户选择 ...

  4. C#常用IO流与读写文件

    .文件系统 ()文件系统类的介绍 文件操作类大都在System.IO命名空间里.FileSystemInfo类是任何文件系统类的基类:FileInfo与File表示文件系统中的文件:Directory ...

  5. [WinAPI] API 10 [创建、打开、读写文件,获取文件大小]

    在Windows系统中,创建和打开文件都是使用API函数CreateFile,CreateFile通过指定不同的参数来表示是新建一个文件,打开已经存在的文件,还是重新建立文件等.读写文件最为直接的方式 ...

  6. Windows下文件的所有和权限

    跟linux不同, 在linux下 ,文件的所有者,就拥有对文件的所有读写执行的权限, 而windows, 文件的所有者不一定对文件拥有所有的权限, 场景: 要对系统文件(windows\system ...

  7. java读写文件大全

     java读写文件大全 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类,这两个类都是抽象类,Writer中 write(char[] ch,int o ...

  8. [Python]读写文件方法

    http://www.cnblogs.com/lovebread/archive/2009/12/24/1631108.html [Python]读写文件方法 http://www.cnblogs.c ...

  9. Console 程序在任务计划程序无法读写文件

    当我们把Console 程序作为Window计划任务的计划任务的操作的时候,我们明明设置了程序的执行权限或者文件夹的读写权限(尝试了所有权限,各种账号读写权限的切换都不好使),但是当我们有读写操作的时 ...

随机推荐

  1. windows2008,命令行远程登录

    命令行强制开启3389服务支持server2008和2003 1.C:\Windows\System32\wbem\wmic /namespace:\\root\cimv2\terminalservi ...

  2. MapReduce源码分析之Task中关于对应TaskAttempt存储Map方案的一些思考

    我们知道,MapReduce有三层调度模型,即Job——>Task——>TaskAttempt,并且: 1.通常一个Job存在多个Task,这些Task总共有Map Task和Redcue ...

  3. 如何让git小乌龟工具TortoiseGit记住你的账号密码

    在使用小乌龟的过程中,发下每次push或者pull都要重复输入账号密码,非常麻烦. 如果能记住账号密码就好了,这样就省去了时间. 怎么设置记住密码 在[系统盘]:\Users[你的用户名]下面,有一个 ...

  4. UVA 1363 Joseph's Problem 找规律+推导 给定n,k;求k%[1,n]的和。

    /** 题目:Joseph's Problem 链接:https://vjudge.net/problem/UVA-1363 题意:给定n,k;求k%[1,n]的和. 思路: 没想出来,看了lrj的想 ...

  5. Spring3.2.6 + hibernate4.2.8 + hibernate-generic-dao1.2.0

    n多方法都不成功,最后在hibernate-generic-dao官网上的例子hibernate-maven-web(使用其jar包及配置,并将hibernate更新为4.2.8,加入ehcache及 ...

  6. python django -5 进阶

    高级知识点包括: 静态文件处理 中间件 上传图片 Admin站点 分页 使用jquery完成ajax 管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义 ...

  7. asp.net 定时间点执行任务的简易解决办法

    这里的定时间点执行任务,指的是每天的某个时间执行一项任务. 比如每天凌晨七点的时候email发送一次报表. 这里首先想到的就是利用 Global.asax 文件来实现, 以下Global文件的内容. ...

  8. TFS2013安装与使用图文教程

    from:http://www.jb51.net/softjc/214560.html TFS2013安装与使用图文教程 一.安装和配置过程介绍 要安装TFS2013当然要先进行下载了,可以在下面的地 ...

  9. 从设计到实现,一步步教你实现Android-Universal-ImageLoader-缓存

    转载请标明出处,本文出自:chaossss的博客 Android-Universal-ImageLoader Github 地址 Cache 我们要对图片进行缓存.有两种方式:内存缓存和本地缓存. 这 ...

  10. hdu 5185(DP)

    不错的一道dp题目,一开始想了一种N*N的dp,后面就一直想怎么优化,然后就一直都在坑中了. 这题题解还是看早了,应该再多想会的,多换种表示状态的方法再想想. dp[i][j]=dp[i-j][j]+ ...