1、示例:存储整型
十进制数11054 的存储形式为:ASCII码: 0011 0001 0011 0001 0011 0000 0011 0101 0011 0100 (5个字节,数字看作字符,存的是其ASCII码值)
十进制数11054的存储形式为:二进制: 101011 00101110 (两个字节) //------>注意:11054的十六进制数为 2B 2E (注意是先存储的低字节00101110(46),后存储的高字节 101011(43))。
当然,如果我们想使用大端序存储的话,可以想将使用htons(11054),将将字节序颠倒一下。
以ASCII形式存储的话,取第一个字节的数,取到的是1;
以二进制形式存储的话,取第一个字节数的数,取到的是46(.的ascii码值)
举例1:
文本文件,ASCII码形式:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
char ch;
int fnum =11054 ;
FILE *fp=fopen("test_1.txt","w+");
if(!fp)
{
perror("fopen");
exit(0);
}
fprintf(fp,"%d",fnum);
fseek(fp,0L,SEEK_SET);
j = fgetc(fp);
fclose(fp);
printf("%c\n",j);
return 0;
}
文件中存储了11054
打印输出:
举例2:二进制文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
char ch;
int fnum = 11054;
FILE *fp=fopen("test.txt","wb+");
if(!fp)
{
perror("fopen");
exit(0);
}
j = fwrite(&fnum,sizeof(int),1,fp);
if(j<1)
perror("fwrite");
fseek(fp,0L,SEEK_SET);
fread(&ch,sizeof(char),1,fp);
fclose(fp);
printf("%c\n",ch);
return 0;
}
文件中存储了.+
打印输出:.
当代码改成 printf("%d\n",ch);输出的时候输出的是46
. 的ASCII码值是46.
小结:对于多个字节数据以二进制码的形式进行单字节去取数的时候,会造成不准确,
比如上述例子,存储了2个字节的数据,值为11054,但是单个字节的存储和取值分别是.和+
当然,如果存储的是单字节数据,比如字符型数据,就不会存在这个问题,如下示例所示:
2、示例:存储字符型数据
存储char ch[] = "hello";
分别采用文本形式和二进制形式存储字符串,发现二者的效果却是完全相同的。
举例1:采用文本形式存储数据
#include <stdio.h>
int main()
{
char ch[]="hello",t;
int i = 0;
FILE *fp = fopen("cfg_1.ini","w+");
for(;ch[i];i++)
{
fprintf(fp,"%c",ch[i]);
}
fseek(fp,0,SEEK_SET);
fscanf(fp,"%c",&t);
fclose(fp);
printf("%c\n",t);
return 0;
}
文件存储:
打印输出:
举例2:采用二进制形式存储文件
#include <stdio.h>
int main()
{
char ch[]="hello",t;
int i = 0;
FILE *fp = fopen("cfg.ini","wb+");
for(;ch[i];i++)
{
fwrite(&ch[i],1,1,fp);
}
fseek(fp,0,SEEK_SET);
fread(&t,1,1,fp);
fclose(fp);
printf("%c\n",t);
return 0;
}
文件中存储:
打印输出: