在C中,使用fopen
打开文件有两种模式:一种是文本模式,一种是二进制模式。那这两种模式之间有什么区别,是不是使用文本模式打开的文件就只能使用文本函数比如fprintf
来操作,而使用二进制打开的文件就只能使用二进制函数比如fwrite
来操作呢?
答案是否定的。C里面之所以有文本模式和二进制模式,完全是出于跨平台的需要。
文本模式的意义
众所周知,在Windows下,CTRL+Z
这个字符用来表示一个文件的结尾,而Unix下使用CTR+D
。此时,如果使用文本模式打开一个文件,当读到CTR+Z
这个字符时,C就能识别出这是文件结尾的标志,在Unix系统下也是一样,当读到CTR+D
,C也知道这事文件结尾,这样就能兼容Windows和Unix两个平台了。而如果使用二进制模式打开同样的文件,当在Windows下读到CTR+Z
,或者是在Unix下读到CTR+D
,都只会被当成一个纯粹的字符来看待。
同样的事情也发生在newline的表示上。在Unix下,newline使用\n
表示,在Windows下,newline使用\r\n
表示,而在Mac下,newline使用\r
表示。这样,当一个文件使用文本模式打开时,如果是读取文件,C会依据平台将\r\n
或者\r
自动转换成\n
,在写入文件时,C会将\n
依据平台自动转换成\r\n
或者\r
,这样就完成了跨平台的操作。而如果使用二进制模式来操作文件,C不会自动做这样的转换,读到\r\n
就是\r\n
,写入\n
也不会自动变成\r\n
。
fprintf和fwrite的区别
fprintf
和fwrite
都是将内容写入到文件,无论文件是以文本模式打开,或者二进制模式打开,它们都不关心,总之写入到文件中的都是一段0和1的编码,只是写入的内容会不一样。