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),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。