其他分享
首页 > 其他分享> > 计算机科学类专升本复习之“C语言fread和fwrite的用法“详解(初稿)

计算机科学类专升本复习之“C语言fread和fwrite的用法“详解(初稿)

作者:互联网

C语言fread和fwrite的用法详解(以数据块的形式读写文件)

fgets()函数有"极限性",每次最多只能"文件中读取一行内容",因为fgtes()遇到"换行符"就结束读取。

如果希望读取多行内容,需要使用fread()函数  相应的写入函数为fwirte()


 

对于 Windows 系统,使用fread()函数和fwrite()函数时应该以"二进制"的形式打开文件。


 

fread()函数 用来 指定文件中 读取"块数据"。

所谓的"快数据"也就是若干个"字节"的数据,可以是"一个字符"也可以是"一个字符串",可以是"多行数据",并没有什么限制。

fread()函数的原型为:

    size_t fread(void *ptr,size_t size,size_t count,FILE *fp);

fwrite()函数用来向文件中"写入" 快数据

它的原型为:

    size_fwrite(void *prt,size_t size,size_t count,FILE *fp);

对参数的说明:

1. prt为内存区的"指针",它可以是"数组、变量、结构体"等。

fread()中的ptr用来存放"读取"到的数据,fwrite()中的prt用来存放要"写入"的数据。

2. size:表示每个数据块的"字节数"

3. count:表示要"读写"的数据块的"块数"

4. fp:表示文件指针

5. 理论上,每次读写 size*count个字节的数据

size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。


 

返回值:

    返回成功时,返回读写的块数(即count)

    如果返回值"小于count":

        对于fwrite()函数来说,"肯定"发生了写入错误,可以用ferror()函数检测。

        对于fread()函数来说,"可能"读到了"文件末尾",也可能发生了"错误",可以用"ferror()"或"feof()"检测

写个程序加深理解把。

//eg:从键盘输入一个数组,将数组写入文件再读取出来。

#include<stdio.h>

#define N 5

int main()

{

    //从键盘输入的数据 放入a ,从文件读取的数据 放入b

    int a[N],b[N];

    int i,size = sizeof(int);

    FILE *fp;



    if((fp=fopen("D:\\demo.txt","rb+")) == NULL)

    {

        puts("Fail to open file!");

        exit(0);

    }



    //从键盘 输入数据 并保存到数组a

    for(i=0;i<N;i++)

    {

        scanf("%d",&a[i]);

    }



    //将数组a的内存写入到文件

    fwrite(a,size,Nfp);

   

    //将文件中的位置指针重新定位到开头

    rewind(fp);



    //从文件读取内存并保存到数组b

    fread(b,size,N,fp);



    //在屏幕上显示数组b的内容

    for(i=0;i<N;i++)

    {

        printf("%d",b[i]);

    }

    printf("\n");

}

结果:

50 444 666 111 580↙

50 444 666 111 580


 

打开 D:\\demo.txt,发现文件内容根本无法阅读。这是因为我们使用"rb+"方式打开文件,数组会原封不动地以二进制形式写入文件,一般无法阅读。

数据写入完毕后,位置指针在文件的末尾,要想读取数据,必须将文件指针移动到文件开头,这就是rewind(fp);的作用。

//eg2从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。

#include<stdio.h>

#define N 2

struct stu{

    char name[10]; //姓名

    int num;  //学号

    int age;  //年龄

    float score;  //成绩

}boya[N], boyb[N], *pa, *pb;

int main(){

    FILE *fp;

    int i;

    pa = boya;

    pb = boyb;

    if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){

        puts("Fail to open file!");

        exit(0);

    }

    //从键盘输入数据

    printf("Input data:\n");

    for(i=0; i<N; i++,pa++){

        scanf("%s %d %d %f",pa->name, &pa->num,&pa->age, &pa->score);

    }

    //将数组 boya 的数据写入文件

    fwrite(boya, sizeof(struct stu), N, fp);

    //将文件指针重置到文件开头

    rewind(fp);

    //从文件读取数据并保存到数据 boyb

    fread(boyb, sizeof(struct stu), N, fp);

    //输出数组 boyb 中的数据

    for(i=0; i<N; i++,pb++){

        printf("%s  %d  %d  %f\n", pb->name, pb->num, pb->age, pb->score);

    }

    fclose(fp);

    return 0;

}

结果:

Input data:

Tom 2 15 90.5↙

Hua 1 14 99↙

Tom  2  15  90.500000

Hua  1  14  99.000000

标签:fp,文件,fwrite,fread,专升本,数据,size
来源: https://blog.csdn.net/weixin_51563198/article/details/122800003