1、C语言中缺省是按照文本方式打开文件。
2、二进制文件和文本文件
(1)文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。
(2)文件通常分为二进制文件和文本文件。
(3)二进制文件是包含在 ASCII 及扩展 ASCII 字符中编写的数据或程序指令的文件。一般是可执行程序、图形、图象、声音等等文件。
(4)文本文件(也称为ASCII文件):它的每一个字节存放的是可表示为一个字符的ASCII代码的文件。它是以 “行”为基本结构的一种信息组织和存储方式的文件,可用任何文字处理程序阅读的简单文本文件。
3、文本方式和二进制方式
(1)按照文本方式(缺省情况下)往文件中写入数据时,一旦遇到换行字符(ASCII为10),则会转换为回车-换行(ASCII为13、10)。多写入了一个字符!在读取文件时,一旦遇到回车-换行的组合(即连续的ASCII 13、10),则会转换为换行字符(ASCII为10)。
(2)当我们按照二进制方式往文件中写入数据,则将数据在内存中的存储形式原样输出到文件中。
(3)在写入和读取文件时要保持一致。如果采用文本方式写入,应采用文本方式读取;如果采用二进制方式写入数据,在读取时也应采用二进制方式。
(4)不管是文本文件还是二进制文件,如果统一采用二进制方式进行写入和读取,则是不会出错的。
(5)不管是文本文件还是二进制文件,都可以采用二进制方式或者文本方式打开,然后进行写入或者读取。但是,对于二进制文件来说,如果以文本方式读取时,可能会出现一些问题。
4、问题产生:给你一个整数,例如:98341,将这个整数保存到文件中,要求在以记事本程序打开该文件时,也显示98341。
如果直接将98341写入文本文件中,然后再打开这个文件肯定看不到这个整数。因为对于文本文件来说,它的每一个字节存放都是可表示为一个字符得ASCII码。如果想在记事本中看到98341这个样子,实际上是得在记事本中看到“这几个字符相应的ASCII码转换后的字符”,也就是说,在记事本中看到的“98341”是五个字符,并不是整数:98341!
文件实际上就是数据内存中的存储形式在外部存储介质上的另一种存放形式。当以记事本打开上述文件,也就是以文本方式打开该文件时,该文件中存储的每一个字节的数据都要作为ASCII码进而转换为相应的字符,但是上述文件中的每一个字节的数据转换为字符之后又是不可读的,因此看到的就是乱码。
直接int i=98341;fwrite(&i,4,1,file);这样只会输出乱码。
解决办法:
(1):
FILE *file; file=fopen("1.txt","w"); char *p="98341"; fwrite(p,1,5,file); fclose(file);
或者(2)
FILE *file; file=fopen("1.txt","w"); char ch[5]; ch[0]='9'; ch[1]='8'; ch[2]='3'; ch[3]='4'; ch[4]='1'; fwrite(ch,1,5,file); fclose(file);
或者(3):我们在存储时去存储“98341”这五个字符的ASCII码(字符“0”的ASCII码是48)。
FILE *pFile=fopen("3.txt","w"); int i=98341; char ch[5]; ch[0]=9+48; ch[1]=8+48; ch[2]=3+48; ch[3]=4+48; ch[4]=1+48; fwrite(ch,1,5,pFile); fclose(pFile);
或者(4)利用itoa()函数将证书转换为字符串,然后将这个字符串写入文件。但是这种方法值涉及数字的保存,如果把数字和字符夹杂在一起,并要求以记事本打开时能看到数字,就不用itoa函数,就要将这些整数数字转换为ASCII码,然后在下写入文件。
FILE *pFile=fopen("3.txt","w"); int i=98341; char ch[5]; itoa(i,ch,10); fwrite(ch,1,5,pFile); fclose(pFile);
版权声明:本文为博主原创文章,未经博主允许不得转载。