Windows读写文件的猫腻
这里主要涉及对于回车换行的讨论。
回车:\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读写文件的猫腻的更多相关文章
- ubuntu samba共享后windows读写文件都是以nogroup问题
添加smb账号 sudo smbpasswd -a xxx 如果报错:Failed to add entry for user xxx 则是因为这个账号不存在 添加成功以后,过一会就可以重新登陆了(u ...
- Python读写文件
Python读写文件1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('t ...
- Inno Setup 如何读写文件
软件安装的实质就是拷贝,对于简单的打包当然不需要考虑修改某(配置)文件.通过inno修改文件的目的在于把安装时相关信息写入文件中,提供其它应用的读取,而这些信息也只能在安装时才能确定,比如安装用户选择 ...
- C#常用IO流与读写文件
.文件系统 ()文件系统类的介绍 文件操作类大都在System.IO命名空间里.FileSystemInfo类是任何文件系统类的基类:FileInfo与File表示文件系统中的文件:Directory ...
- [WinAPI] API 10 [创建、打开、读写文件,获取文件大小]
在Windows系统中,创建和打开文件都是使用API函数CreateFile,CreateFile通过指定不同的参数来表示是新建一个文件,打开已经存在的文件,还是重新建立文件等.读写文件最为直接的方式 ...
- Windows下文件的所有和权限
跟linux不同, 在linux下 ,文件的所有者,就拥有对文件的所有读写执行的权限, 而windows, 文件的所有者不一定对文件拥有所有的权限, 场景: 要对系统文件(windows\system ...
- java读写文件大全
java读写文件大全 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类,这两个类都是抽象类,Writer中 write(char[] ch,int o ...
- [Python]读写文件方法
http://www.cnblogs.com/lovebread/archive/2009/12/24/1631108.html [Python]读写文件方法 http://www.cnblogs.c ...
- Console 程序在任务计划程序无法读写文件
当我们把Console 程序作为Window计划任务的计划任务的操作的时候,我们明明设置了程序的执行权限或者文件夹的读写权限(尝试了所有权限,各种账号读写权限的切换都不好使),但是当我们有读写操作的时 ...
随机推荐
- 随机生成数,摘自算法竞赛入门经典P120-P123测试STL。
//#include<bits/stdc++.h> #include<cstring> #include<iostream> #include<cstdio& ...
- JIRA /mnt/server/atlassian-jira-6.3.6-standalone/bin/start-jira.sh
JIRA 敏捷开发平台部署记录 分类: 敏捷开发 1.1 jira说明 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪. ...
- Oracle----oracle 事务总结
用了这么长时间的oracle,该总结一下所得了 1,事务 事务用于保证数据的一致性, 它由一组相关的 dml语句组成, 该组的dml(数据操作语言,增删改,没有查询)语句要么全部成功,要么全部失败,比 ...
- CSS隐藏滚动条但又能滚动,不用js实现
隐藏多余的内容,但是可以滑动查看 原理就在于padding-right:17px;把滚动条挤出去隐藏了
- 前端webview开发中遇到的一些问题及其解决方法
最近做了一个webview中的兑换页面,本来以为很简单,想不到遇到了远远超出预期数量的BUG,记下来,以备后患. 1 inline-block元素折行 BUG描述:现在我有三个DIV,要在一列等宽排列 ...
- 访问 JavaBean 对象的属性
在 <jsp:useBean> 标签主体中使用 <jsp:getProperty/> 标签来调用 getter 方法,使用 <jsp:setProperty/> 标 ...
- 编译包中的 Servlet
编译包中的类与编译其他的类没有什么大的不同.最简单的方法是让您的 java 文件保留完全限定路径,如上面提到的类,将被保留在 com.myorg 中.您还需要在 CLASSPATH 中添加该目录. 假 ...
- Web应用程序使用Hibernate
在本文中,我们将学习使用hibernate创建一个Web应用程序. 对于创建Web应用程序,我们使用JSP表示逻辑层,使用Bean类表示数据,以及使用DAO类操作数据库.在hibernate中创建简单 ...
- cv resource
http://blog.sina.com.cn/s/blog_5086c3e20101kdy5.html
- Mysql权限体系
1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVO ...