C语言实现成块数据读写操作 fread() fwrite()

首先讲解 c 语言中文件操作的两个关键函数:fread()、fwrite()

1. fread( buffer , size , count , fp)

该函数实现从 fp 所指的文件中读入 count 次,每次读 size 字节,读入的信息存在 buffer 中。

2. fwrite( buffer , size ,count , fp)

该函数实现将 buffer 地址开始的信息,输出 count 次,每次写 size 字节到 fp所指的文件中。

接下俩看程序实例:

我们首先定义一个学生类型的结构体,通过键盘输入学生的基本信息,保存到指定磁盘文件中,输入全部信息后,我们将保存在磁盘文件中的信息读出并显示在屏幕上。

/*
成块读写操作
核心通过函数fwrite()函数和fread()函数实现
本程序实现将多组块数据写入文件,之后从文件中读出
*/
#include <stdio.h>
#include <stdlib.h>

//定义结构体类型数组
struct student_score{
    char name[10];
    int num;
    int China;
    int Math;
    int English;
}score[100];

//函数save()将输入的数据输出到指定的磁盘文件中
//name指向文件名 n表示信息个数
void save(char * name,int n){
    FILE * fp;
    int i;
    if((fp=fopen(name,"wb"))==NULL){  //以只写方式打开指定文件
        printf("cannot open file\n");
        exit(0);
    }
    for(i=0;i<n;++i){
        //将一组数据输出到fp所指向的文件中
        if(fwrite(&score[i],sizeof(struct student_score),1,fp)!=1){
            printf("file write error\n");
        }
    }
    fclose(fp);  //关闭文件
}


//函数show()从指定的文件中读入一组数据并显示在屏幕上
//name指向文件名,n表示信息个数
void show(char * name,int n){
    int i;
    FILE * fp;
    if((fp=fopen(name,"rb"))==NULL){  //若打开文件失败
        printf("cannot open file\n");
        exit(0);
    }
    for(i=0;i<n;++i){
        //从fp所指文件中读入数据存到数组score中
        fread(&score[i],sizeof(struct student_score),1,fp);
        printf("%-10s%4d%4d%4d%4d\n",score[i].name,score[i].num,score[i].China,score[i].Math,score[i].English);
    }
    fclose(fp);
}

int main()
{
    int i,n;
    char filename[50];
    printf("How many students in your class ? \n");
    scanf("%d",&n);
    printf("Please input the file name :\n");
    scanf("%s",filename);
    printf("Please input name, number, China, Math, English : \n");
    for(i=0;i<n;++i){
        printf("No%d\n",i+1);
        scanf("%s%d%d%d%d",score[i].name,&score[i].num,&score[i].China,&score[i].Math,&score[i].English);
        save(filename,n);  //调用save()函数将输入的数据保存到文件
    }
    show(filename,n);  //调用show()函数显示学生信息
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Ibelievesunshine/article/details/80053926