C语⾔读写⽂件两种⽅式ASCII和⼆进制。
C语⾔读写⽂件有两种⽅式ASCII 和 ⼆进制。现在举例说明:
内存中的字符或字符串都是⽂本模式(unicode编码存储,统⼀长度,定长码,⽅便)
内存中的其他变量都是以⼆进制编码存储
程序的代码以⽂本模式ASCII码⽅式存储
1.在windows系统中,⽂本模式下,⽂件以"\r\n"代表换⾏。若以⽂本模式打开⽂件,并⽤fputs等函数写⼊换⾏符"\n"时,函数会⾃动在"\n"前⾯加上"\r"。即实际写⼊⽂件的是"\r\n" 。读取的时候⾃动去掉\r,将\n写⼊内存。
2.在类Unix/Linux系统中⽂本模式下,⽂件以"\n"代表换⾏。所以Linux系统中在⽂本模式和⼆进制模式下并⽆区别。
注:Windows 采⽤ \r\n 是有原因的,Windows 采⽤了传统的英⽂打字机的模式。
想想看英⽂打字机是如何换⾏的呢?英⽂打字机是选择将⼩车退回⾄起点,
这个过程称为回车(carriage return, CR),随后把⼩车调⾄下⼀⾏的位
置,这个过程称为换⾏(line feed, LF),这样就完成了英⽂打字机中换
⾏过程。
回车(CR)在计算机中使⽤ ASCII 为 13 的字符来表⽰,换⾏(LF)使⽤
ASCII 为 10 的字符来表⽰。这也就是 Windows 的换⾏采⽤ \r\n 来表⽰
的原因。
3.当⽤⼆进制模式读取windows下代表换⾏的\r\n时,不能⾃动去掉\r,这样读⼊内存的数据多了⼀个‘\r’,造成跟在‘\r’后⾯的⼆进制位右移,读取必然会出错!
4.如果在⽂件中读到0x1B,⽂本模式会认为这是⽂件结束符,也就是⼆进制模型不会对⽂件进⾏处理,⽽⽂本⽅式会按⼀定的⽅式对数据作相应的转换。二进制编码转换
5.⽤⽂本模式写⽂件,读取时也要⽤⽂本模式,⼆进制模式同样。
将⼆进制数据直接写⼊到⽂件中
Int x = 128;
fp = fopen("g:\\1.txt","wb");
fwrite(&a,4,1,fp);
这时候1.txt中的内容如果⽤记事本打开,乱码,因为记事本是按照ASCII编码⽅式(现在系统默认使⽤的都是GB2312 unicode等编码)解释⽂件,⽽128在内存⾥⾯是四字节的0000 0000 1000 0000,这样⽤系统的编码解释肯定出错。
如果将128存储为asii形式,即字符串的形式,内存中存放相应的ascii码61 62 63(这为了⽅便些了⼗进制,内存中⼆进制) 此时再写到⽂件⾥⾯,这样打开txt的时候⽂件就能正常的解释编码,从⽽实现从编码到字符的映射!
C语⾔存取⽂件时候有⽂本模式和⼆进制模式,即r和rb、w和wb,这⾥的影响仅限于上述1、2,对fputc fwrite函数写到⽂件的内容没有其他影响,仍然都是内容中的⼆进制数据按字节写出到⽂件中。⽽ fprintf则将⼆进制转换成ASCII输出到⽂件中,fscanf将读取的ascii码转换成⼆进制放到内存中,效率略低。
fgetc fputc 都是按照字节存取,⽆论⽂本模式还是⼆进制模式打开,都按照⼀个⼀个字节读取,不存
在\r\n问题。
附⼀篇不错的⽂章:
ASCII⽂件也称为⽂本⽂件,这种⽂件在磁盘中存放时每个字符对应⼀个字节,⽤于存放对应的ASCII码。例如,数5678的存储形式为: ASC码:00110101 00110110 00110111 00111000
      ↓        ↓       ↓         ↓
⼗进制码:  5     6      7      8 共占⽤4个字节。ASCII码⽂件可在屏幕上按字符显⽰, 例如源程序⽂件就是ASCII⽂件,⽤DOS命令TYPE可显⽰⽂件的内容。 由于是按字符显⽰,因此能读懂⽂件内容。 ⼆进制⽂件是按⼆进制的编码⽅式来存放⽂件的。例如, 数5678的存储形式为: 00010110 00101110只占⼆个字节。⼆进制⽂件虽然也可在屏幕上显⽰, 但其内容⽆法读懂。C系统在处理这些⽂件时,并不区分类型,都看成是字符流,按字节进⾏处理。 输⼊输出字符流的开始和结束只由程序控制⽽不受物理符号(如回车符)的控制。 因此也把这种⽂件称作"流式⽂件"。 ⼀个⽂件可以以⽂本模式或⼆进制模式打开,这两种的区别是:在⽂本模式中回车被当成⼀个字符'\n',⽽⼆进制模式认为它是两个字符0x0D,0x0A;如果在⽂件中读到0x1B,⽂本模式会认为这是⽂件结束符,也就是⼆进制模型不会对⽂件进⾏处理,⽽⽂本⽅式会按⼀定的⽅式对数据作相应的转换。 ⽂件看作是由⼀个⼀个字节(byte) 组成的,那么⽂本⽂件中的每个字节的最⾼位都是0,也就是说⽂本⽂件使⽤了⼀个字节中的
七位来表⽰所有的信息,⽽⼆进制⽂件则是将字节中的所有位都⽤上了。 不管是⼆进制⽂件也好,还是⽂本⽂件也好,都是⼀连串的0和1,但是打开⽅式不同,对于这些0和1的处理也就不同。如果按照⽂本⽅式打开,在打开的时候会进⾏translate,将每个字节转换成ASCII码,⽽以按照⼆进制⽅式打开的话,则不会进⾏任何的translate; ⽂本⽂件和⼆进制⽂件在编辑的时候,使⽤的⽅式也是不同的。譬如,你在记事本中进⾏⽂本编辑的时候,你进⾏编辑的最⼩单位是字节(byte);⽽对⼆进制⽂件进⾏编辑的话,最⼩单位则是位(bit),当然我们都不会直接通过⼿⼯的⽅式对⼆进制⽂件进⾏编辑了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。