C语言中文本文件和二进制文件举例分析

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;
}

文件中存储:

打印输出:

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值