Fread 和 Fwrite 函数参数详解

rest1024 2026-05-07 13:24:23

一、函数原型(C语言标准)

1. fwrite函数(内存→文件)(ptr-> stream)

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

2. fread函数(文件→内存)(stream-> ptr)

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

其中size_t是C语言内置的无符号整数类型(通常对应unsigned int),用于表示数据大小或数量。

二、参数逐个拆解(4个参数,按顺序详解)

两个函数的4个参数完全对应,仅第一个参数的const修饰有区别(fwrite的数据源不可修改,fread的目标内存可修改),下面统一解析:

参数序号

参数名

参数类型

核心含义(通俗解释)

注意事项

1

ptr

fwrite:        const void*

fread:void*

数据的“存放地址”(读写缓冲区地址)

- fwrite:指向要写入文件的数据在内存中的起始地址(比如数组、结构体变量的地址)

- fread:指向用来接收文件数据的内存缓冲区起始地址(比如空数组、空结构体的地址)

- void*表示可以接收任意数据类型的地址(int、char、结构体等),无需强制类型转换

2

size

size_t

单个数据块的“字节大小”

即你要读写的每一个独立数据的字节数,通常用sizeof()函数获取(比如sizeof(int)sizeof(Student)),避免手动写固定数值(提高兼容性)

3

count

size_t

要读写的“数据块数量”

即你要读写多少个上述size大小的数据块(比如要读写10个int类型数据,size=sizeof(int)count=10

4

stream

FILE*

指向目标文件的“文件指针”

即通过fopen()函数打开文件后返回的指针,需注意:

- fwrite对应文件打开模式:wb(二进制写入)、ab(二进制追加)等

- fread对应文件打开模式:rb(二进制读取)等<br>- 不能直接传递文件名,必须是合法的FILE类型指针

三、参数理解示例(通俗化场景)

假设我们要读写一个“学生结构体”数据,更直观理解参数:

// 定义学生结构体

typedef struct {

char name[20];

int id;

float score;

} Student;

Student stu = {"张三", 1001, 98.5}; // 要写入的学生数据

Student stu_read; // 用来接收读取数据的空结构体

FILE *fp = fopen("student.dat", "wb+"); // 二进制读写模式打开文件

1. fwrite参数代入

// 把stu的数据写入文件

fwrite(

&stu, // 参数1:要写入的数据地址(stu的地址)

sizeof(Student), // 参数2:单个数据块大小(1个学生结构体的字节数)

1, // 参数3:数据块数量(只写入1个学生数据)

fp // 参数4:文件指针(指向student.dat)

);

2. fread参数代入

// 从文件读取数据到stu_read

fread(

&stu_read, // 参数1:接收数据的内存地址(stu_read的地址)

sizeof(Student), // 参数2:单个数据块大小(1个学生结构体的字节数)

1, // 参数3:数据块数量(只读取1个学生数据)

fp // 参数4:文件指针(指向student.dat)

);

四、补充:函数返回值(与参数关联紧密)

返回值类型为size_t,表示实际成功读写的“数据块数量”(即对应参数3的count的实际完成数)

  1. 正常情况:返回值等于count(所有数据块都成功读写);

  2. 异常情况:返回值小于count(可能是文件末尾、读写错误或磁盘空间不足),可通过feof()(判断是否到文件尾)或ferror()(判断是否读写错误)排查问题。

 

总结

  1. fread/fwrite共4个参数,顺序为:数据地址→单个块大小→块数量→文件指针

  2. 参数1区分读写方向(fwrite是数据源地址,fread是数据接收地址);

  3. 参数2和3共同决定总读写字节数(总字节数=size×count);

  4. 参数4必须是fopen打开的合法二进制模式文件

参考链接:https://github.com/0voice

...全文
128 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

562

社区成员

发帖
与我相关
我的任务
社区描述
零声学院,目前拥有上千名C/C++开发者,我们致力将我们的学员组织起来,打造一个开发者学习交流技术的社区圈子。
nginx中间件后端 企业社区
社区管理员
  • Linux技术狂
  • Yttsam
  • 零声教育-晚晚
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请新加入的VIP学员,先将自己参加活动的【所有文章】,同步至社区:

【内容管理】-【同步至社区-【零声开发者社区】

试试用AI创作助手写篇文章吧