ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-06 17:59:11  阅读:165  来源: 互联网

标签:fp 文件 fwrite fread 专升本 数据 size


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有