fprintf fscanf fwrite fread

本文通过两个测试案例详细介绍了如何使用 C 语言中的 fwrite 和 fread 函数进行二进制数据的读写,并展示了如何在指定位置写入数据的具体实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fprintf和fscanf是一对,他们是以字符形式往内存中写,也就是说无论你往文件里写什么,它通通都把它转成字符再写入;

fwrite和fread是一对,他们是以二进制形式往里写,也就是说写的值原本值是什么,就写什么。

所以用的时候要注意,不能交叉使用。


例如 fprintf写如整数1,内存形式为:0x31,即字符1的 acsii码49;

fwrite写入整数1,内存形式为:0x01 00 00 00,即1。


测试一:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

struct user
{
    int id;
    char name[10];
    int yi;
    int er;
    int san;
    double ave;
};

int main() {
    int id;
    char name[10];
    int yi;
    int er;
    int san;
    double ave;
    
    int int1[10];
    double double1[10];
    
    FILE *file;
    if((file=fopen("E:\\a.txt","rw+"))==NULL) 
      {
        printf("open file error!\n");
        system("pause");
        return 0;
      }

    int1[0]=1;
    fwrite(int1,sizeof(int),1,file);
    //fprintf(file,"%d",int1[0]);
	strcpy(name,"huang");
    fwrite(name,sizeof(char),10,file);
    //fprintf(file,"%s",name);
	int1[0]=1;
    fwrite(int1,sizeof(int),1,file);
    //fprintf(file,"%d",int1[0]);
	int1[0]=2;
    fwrite(int1,sizeof(int),1,file);
    //fprintf(file,"%d",int1[0]);
	int1[0]=3;
    fwrite(int1,sizeof(int),1,file);
    //fprintf(file,"%d",int1[0]);
	double1[0]=1.0;
    fwrite(double1,sizeof(double),1,file);
    //fprintf(file,"%f",double1[0]);

    memset(int1,0,sizeof(int)*10);
    

    fread(&int1[0],sizeof(int),1,file);
    fread(name,sizeof(char),10,file);
    fread(&int1[1],sizeof(int),1,file);
    fread(&int1[2],sizeof(int),1,file);
    fread(&int1[3],sizeof(int),1,file);
    fread(&ave,sizeof(double),1,file);


    
//    fscanf(file,"%d%s%d%d%d%f",&int1[0],name,&int1[1],&int1[2],&int1[3],&ave);

    printf("%d\n",int1[0]);
	printf("%s\n",name);
    printf("%d\n",int1[1]);
    printf("%d\n",int1[2]);
    printf("%d\n",int1[3]);
    printf("%f\n",ave);

    fclose(file);
    
    system("pause");
    return 0 ;
    }


测试二:

在指定位置写入

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

struct user
{
    int id;
    char name[10];
    int yi;
    int er;
    int san;
    double ave;
};

int main() {
	int unit;
    int id;
    char name[10];
    int yi;
    int er;
    int san;
    double ave;
    
    int int1[10];
    double double1[10];
    
    FILE *file;
    if((file=fopen("E:\\a.txt","r+b"))==NULL) 
      {
        printf("open file error!\n");
        system("pause");
        return 0;
      }
    
	rewind(file);

    int1[0]=1;
    fwrite(int1,sizeof(int),1,file);
    //fprintf(file,"%d",int1[0]);
	strcpy(name,"huang");
    fwrite(name,sizeof(char),10,file);
    //fprintf(file,"%s",name);
	int1[0]=1;
    fwrite(int1,sizeof(int),1,file);
    //fprintf(file,"%d",int1[0]);
	int1[0]=2;
    fwrite(int1,sizeof(int),1,file);
    //fprintf(file,"%d",int1[0]);
	int1[0]=3;
    fwrite(int1,sizeof(int),1,file);
    //fprintf(file,"%d",int1[0]);
	double1[0]=1.0;
    fwrite(double1,sizeof(double),1,file);
    //fprintf(file,"%f",double1[0]);
    
    memset(int1,0,sizeof(int)*10);
    
    rewind(file);

    fread(&int1[0],sizeof(int),1,file);
    fread(name,sizeof(char),10,file);
    fread(&int1[1],sizeof(int),1,file);
    fread(&int1[2],sizeof(int),1,file);
    fread(&int1[3],sizeof(int),1,file);
	
	int pos = ftell(file);
	printf("pos is: %d\n",pos);
    
    fread(&ave,sizeof(double),1,file);

    printf("%d\n",int1[0]);
	printf("%s\n",name);
    printf("%d\n",int1[1]);
    printf("%d\n",int1[2]);
    printf("%d\n",int1[3]);
    printf("%f\n",ave);

    ave=(int1[0]+int1[1]+int1[2]+int1[3])/3.0;
    unit=sizeof(int)*4+sizeof(char)*10;
	fseek(file,unit,SEEK_SET);
	pos=ftell(file);
	printf("set pos is: %d\n",pos);
	double1[0]=ave;
    fwrite(double1,sizeof(double),1,file);
    fflush(file);
//    fscanf(file,"%d%s%d%d%d%f",&int1[0],name,&int1[1],&int1[2],&int1[3],&ave);

	rewind(file);

    fread(&int1[0],sizeof(int),1,file);
    fread(name,sizeof(char),10,file);
    fread(&int1[1],sizeof(int),1,file);
    fread(&int1[2],sizeof(int),1,file);
    fread(&int1[3],sizeof(int),1,file);
	
	fread(&ave,sizeof(double),1,file);
    

    printf("%d\n",int1[0]);
	printf("%s\n",name);
    printf("%d\n",int1[1]);
    printf("%d\n",int1[2]);
    printf("%d\n",int1[3]);
    printf("%f\n",ave);

    fclose(file);
    
    system("pause");
    return 0 ;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值