fwrite函数是C语言标准库中用于向指定文件流写入二进制数据的函数,它的调用形式有明确的语法规范,所有参数都需要按照固定顺序传入,才能保证文件写入操作正常执行。

fwrite函数的基本调用形式
fwrite函数的标准调用形式如下:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
该函数定义在<stdio.h>头文件中,调用时需要传入四个参数,最终返回成功写入的成员数量。
参数含义详解
fwrite的四个参数各自有明确的用途,具体说明如下:
- ptr:指向待写入数据的内存地址指针,可以是任意类型数据的地址,比如数组首地址、结构体变量地址等。
- size:单个写入数据单元的大小,单位是字节,通常使用
sizeof运算符获取对应类型的大小。 - nmemb:需要写入的数据单元的个数,也就是要写入多少个size大小的数据块。
- stream:指向已经打开的文件流的指针,这个文件流需要通过
fopen函数打开,并且打开模式需要支持写入操作。
返回值说明
fwrite函数的返回值是size_t类型的无符号整数,表示实际成功写入的数据单元个数。如果返回值小于nmemb,说明写入过程中出现了错误,或者达到了文件末尾。因此在实际使用时,通常需要判断返回值是否符合预期,来确认写入操作是否成功。
使用示例
示例1:写入整型数组到文件
下面的代码演示了将整型数组的数据通过fwrite写入到二进制文件中:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
FILE *fp = fopen("test.bin", "wb"); // 以二进制写入模式打开文件
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
// 调用fwrite写入数组数据,每个单元大小是int的大小,共5个单元
size_t ret = fwrite(arr, sizeof(int), 5, fp);
if (ret != 5) {
printf("数据写入不完整n");
} else {
printf("成功写入%d个数据单元n", ret);
}
fclose(fp); // 关闭文件流
return 0;
}
示例2:写入结构体数据到文件
fwrite也常用于写入结构体数据,下面的代码演示了将结构体变量写入文件的操作:
#include <stdio.h>
#include <string.h>
// 定义结构体类型
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
Student stu;
stu.id = 1001;
strcpy(stu.name, "张三");
stu.score = 89.5;
FILE *fp = fopen("student.bin", "wb");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
// 写入单个结构体数据,单元大小是Student的大小,共1个单元
size_t ret = fwrite(&stu, sizeof(Student), 1, fp);
if (ret != 1) {
printf("结构体数据写入失败n");
} else {
printf("结构体数据写入成功n");
}
fclose(fp);
return 0;
}
使用注意事项
- 打开文件时的模式需要匹配,如果要写入二进制数据,建议使用
wb模式,避免文本模式下的换行符转换导致数据错误。 - ptr指向的内存区域必须有效,不能传入空指针或者已经释放的内存地址。
- size和nmemb的乘积不能超过ptr指向的内存区域的实际大小,否则可能会读取到非法内存导致程序异常。
- 写入操作完成后要及时调用
fclose关闭文件流,避免数据缓存未刷新到文件中。