实现上没啥区别,只是文本方式打开时会对换行符做特殊处理,可以看看msdn关于CFile的介绍
解决方案 »
- 如fopen、fread、fwrite等C语言文件操作函数中,有 “清楚文件内容,而保留一个空文件”的函数吗? 如果没有如何,实现这样的功能
- 求助 怎么往打印机发送 打印命令呢
- 文件正在传输中,如果发送方断开,那么接收方如何处理?
- 父窗口如何得知子窗口有鼠标消息?
- 如何利用ado把access数据库中的所有表,导出到一个XML文件中,then 导入数据库恢复,在线等待!
- **请问在服务中开了一个新的进程为何打不开数据库文件?
- 我使用SetCurSel(0),怎么我的combo控件不能选中第一行?
- 请问ActiveX和COM有何异同??
- VC+ADO访问SQL的问题 ·!急啊,。。。
- 我在上海,今年28岁,C语言略有基础,VC稍有基础,但还是比较弱。我想尽快精通VC...
- native wifi api 求助
- DirectX菜鸟问题!
头3个字节(非ASCII)用来区别编码
比如一篇文章,如果用中文写的,你一看就懂,你就可以蛋疼的定义它为文本模式
与之对应,同样内容,你用英文写的或者甲骨文写的,你就可以定义为二进制模式
新华字典你姑且可以定义为"记事本",用对应看这篇文章,就是OK的
如果你用新华字典来尝试看英文写的文章,你就可以称呼它为乱码.
2.二种打开方式稍有区别,就是换行代码0D0A表示,文本认为它就是一个字符,二进制认位是2个字符
你就知道文本有多蛋疼了.
3.文件头是你规定的数据,你说有就有,没有就没有.文本文件一般区分就是.TXT结尾.
这其实很忽悠老百姓,我写一个二进制文件,我就用.TXT扩展名,你咬我啊.
4.你把文本文件看成二进制文件的一种,就可以理解了,世界上本就没有所谓文本,都是吃多了撑出来的.
1、为什么用fopen打开文件要分二制度和文本文件模式?
这是两种解释方式2、二种打开方式在实现上有什么区别吗?
与其说打开方式,不如说是文件内容的解释方式。
二进制就是以字节来读取写入,没有任何的附加动作。
文本方式对回车和换行符进行了处理,具体参看msdn的这段:
In text mode, carriage return–linefeed combinations are translated into single linefeeds on input, and linefeed characters are translated to carriage return–linefeed combinations on output. When a Unicode stream-I/O function operates in text mode (the default), the source or destination stream is assumed to be a sequence of multibyte characters. Therefore, the Unicode stream-input functions convert multibyte characters to wide characters (as if by a call to the mbtowc function). For the same reason, the Unicode stream-output functions convert wide characters to multibyte characters (as if by a call to the wctomb function). 3、文本文件有没有文件头?如果有,它的格式是什么?如果没有,它不就是一个纯01串流吗,我们怎么知道它是文本文件呢?
没有文件头。4、文件文件的编码是怎么回事呢?unicode 和ascii 的编码 在文件里面是通过什么来区别出来的呢?
很明显,在文件里并没有文件头或特别的标记。只是解释方式不同。
很明显,在文件里并没有文件头或特别的标记。只是解释方式不同。”
头3个字节(非ASCII)用来区别编码
刚才确认了一下,确实有标记,但是是两个字节FFFE感谢提醒。
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
*/
简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8),基于字符嘛,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。应该说C的文本读写与二进制的读写是一个编程层次上的问题,与具体的操作系统有关,所以"用文本方式读写的文件一定是文本文件,用二进制读写的文件一定是二进制文件"这类观点是错误的.下面的讲述非明确指出操作系统类型,都暗指windows.C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.文本方式写时,每遇到一个''\n''(0AH换行符),它将其换成''\r\n''(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个''\r\n''将其反变化为''\n'',然后送到读缓冲区.正因为文本方式有''\n''--''\r\n''之间的转换,其存在转换耗时.二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.总地来说,从编程的角度来说,C中文本或二进制读写都是缓冲区与文件中二进制流的交互,只是文本读写时有回车换行的转换.所以当写缓冲区中无换行符''\n''(0AH),文本写与二进制写的结果是一样的,同理,当文件中不存在''\r\n''(0DH0AH)时,文本读与二进制读的结果一样.
pf1 = fopen("f:\\1.txt","r");//或者pf1 = fopen("f:\\1.txt","rb");
for(int i=0;i <6;i++){
fread(&a[i],1,1,pf1);
printf("%0X ",a[i]);
}
fclose(pf1);//关闭文件的结果分别为:
41 62 31 32 33 0A 和 41 62 31 32 33 0D
5678的存储形式为:ASCII码: 00110101 00110110 00110111 00111000 (四个字节)
5678的存储形式为:二进制: 00010110 00101110 (两个字节)
二进制文件和文本文件的唯一差异就是前者含有一些非标准输出的ASCII码。0x01就是非标准输出的ASCII码,0x61就是标准输出的ASCII码。)
文本文件通常以 .txt作为扩展名,其内容为自然语言的简单记录数据,自然语言分为英语和其它语言两种,对于其它语言,常常会涉及到编码问题,所以衍生出了BOM
早期的文本文件只包可打印的ASCII字符和极少的几个文本控制符号,那时的计算机输出设备还不支持图形...理论上,所有的文件都是二进制文件,文本文件是其中的一个特例
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
楼上都说的很清楚了.
txt方式打开 是可见字符.
bin 是二进制.不是可见字符.