562
社区成员
发帖
与我相关
我的任务
分享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个参数完全对应,仅第一个参数的const修饰有区别(fwrite的数据源不可修改,fread的目标内存可修改),下面统一解析:
|
参数序号 |
参数名 |
参数类型 |
核心含义(通俗解释) |
注意事项 |
|
1 |
ptr |
fwrite: const void* fread:void* |
数据的“存放地址”(读写缓冲区地址) |
- fwrite:指向要写入文件的数据在内存中的起始地址(比如数组、结构体变量的地址) - fread:指向用来接收文件数据的内存缓冲区起始地址(比如空数组、空结构体的地址) - |
|
2 |
size |
size_t |
单个数据块的“字节大小” |
即你要读写的每一个独立数据的字节数,通常用 |
|
3 |
count |
size_t |
要读写的“数据块数量” |
即你要读写多少个上述 |
|
4 |
stream |
FILE* |
指向目标文件的“文件指针” |
即通过 - fwrite对应文件打开模式: - fread对应文件打开模式: |
假设我们要读写一个“学生结构体”数据,更直观理解参数:
// 定义学生结构体
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的实际完成数):
正常情况:返回值等于count(所有数据块都成功读写);
异常情况:返回值小于count(可能是文件末尾、读写错误或磁盘空间不足),可通过feof()(判断是否到文件尾)或ferror()(判断是否读写错误)排查问题。
fread/fwrite共4个参数,顺序为:数据地址→单个块大小→块数量→文件指针;
参数1区分读写方向(fwrite是数据源地址,fread是数据接收地址);
参数2和3共同决定总读写字节数(总字节数=size×count);
参数4必须是fopen打开的合法二进制模式文件