当前位置: 首页 > news >正文

【C语言】fwrite函数用法介绍

目录

一、函数原型

二、参数解析

三、返回值

四、核心特性

五、案例代码

案例1:写入字符串到文件

案例2:写入整型数组到二进制文件

案例3:写入结构体数据

六、注意事项


 

一、函数原型

作用:将内存中的数据块以二进制形式写入文件,适用于非文本数据(如结构体、数组等)。

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

二、参数解析

  1. ptr
    • 类型:const void*
    • 作用:指向待写入数据的缓冲区首地址,可以是数组、结构体或动态分配的内存块。
    • 示例:int data[] = {1,2,3}; fwrite(data, ...)
  2. size
    • 类型:size_t
    • 作用:单个数据项的字节大小,通常用sizeof运算符获取(如sizeof(int))。
    • 注意:若数据项为数组元素,需计算单个元素大小而非整个数组。
  3. count
    • 类型:size_t
    • 作用:要写入的数据项数量。例如数组长度为5时,count设为5。
  4. stream
    • 类型:FILE*
    • 作用:目标文件指针,需通过fopen以二进制模式(如"wb""ab")打开。

三、返回值

  • 成功时返回实际写入的数据项数量(非字节数)。
  • 失败时返回值可能小于count,需结合feofferror检查错误。

四、核心特性

  1. 二进制操作:默认处理二进制数据,适合图像、结构体等非文本内容。
  2. 写入位置:由文件打开模式决定:
    • "w+":从文件头覆盖写入。
    • "a+":追加到文件末尾。
  3. 缓冲区同步:写入后需调用fflush(stream)fclose(stream)确保数据持久化。

五、案例代码

案例1:写入字符串到文件

代码实例如下:(不适用fopen进行打开文件原因,详见C4996报错)

#include <stdio.h>

int main() {
    FILE* fp;
	if (fopen_s(&fp, "data.txt", "wb") != 0) {
		perror("File error");
		return -1;
	}


	char buffer[] = "Hello, fwrite!";
	size_t written = fwrite(buffer, sizeof(char), sizeof(buffer), fp);
	if (written != sizeof(buffer)) {
		printf("Write error\n");
	}

	fclose(fp);
	return 0;
}

代码执行结果:

见文件内容写入到了工程目录下的data.txt文件中。

案例2:写入整型数组到二进制文件

代码实例如下:

#include <stdio.h>

int main() {
    FILE *fp;
	if (fopen_s(&fp, "numbers.bin", "wb") != 0) {
		perror("File error");
		return -1;
	}

    int data[] = {10, 20, 30, 40, 50};
    size_t count = sizeof(data) / sizeof(int);
    size_t written = fwrite(data, sizeof(int), count, fp);
    
    if (written != count) {
        printf("Partial write\n");
    }

    fclose(fp);
    return 0;
}

代码执行结果:

        使用WinHex软件打开工程目录下新生成的numbers.bin文件,可以到数据已经写入到文件中了,并且以十六进制显示。由于每个int数据是4字节,所有文件中是32bit。

案例3:写入结构体数据

代码实例如下:

#include <stdio.h>

typedef struct {
	int id;
	char name[20];
	float score;
} Student;//创建结构体

int main() {
	Student stu = { 101, "Alice", 95.5 };//结构体初始化

	FILE *fp;
	if (fopen_s(&fp, "student.txt", "wb") != 0) {
		perror("File error");
		return -1;
	}

	size_t written = fwrite(&stu, sizeof(Student), 1, fp);
	fclose(fp);
	return 0;
}

代码执行结果:


六、注意事项

  1. 二进制模式:写入非文本数据时使用"wb""ab"模式,避免换行符转换问题参考文章。
  2. 数据对齐:结构体成员可能有内存对齐问题,建议使用#pragma pack(1)取消填充参考文章。
  3. 跨平台兼容:二进制文件在不同系统间可能存在字节序差异(如小端存储)参考文章。

 

 

相关文章:

  • PHP旅游门票预订系统小程序源码
  • 提示:这里可以添加要学的内容3
  • Java Web开发实战与项目——用户认证与授权模块开发
  • AlphaFold v3.0.1 conda版本详细安装与使用
  • Nginx 在Linux中安装、使用
  • order by 字段没有在 select distinct 中的问题
  • OpenMv识别色块通过串口发给STM32
  • vue3之echarts3D圆柱
  • share.py
  • Java集合之ArrayList(含源码解析 超详细)
  • python-leetcode 36.二叉树的最大深度
  • 使用vscode调试transformers源码
  • Linux中的Ctrl+C与Ctrl+Z
  • Docker 容器安装 Dify的两种方法
  • 审计级别未启用扩展模式导致查询 DBA_AUDIT_TRAIL 时 SQL_TEXT 列为空
  • Swupdate升级不强制依赖version字段
  • 装win10系统提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”解决方法
  • DeepSeek 通过 ollama 轻松本地部署
  • LeetCode 热题 100_N 皇后 (62_51_困难_C++)(递归(回溯))
  • 【一文读懂】JS与Java的区别
  • 中国科考船在钓鱼岛附近活动,外交部:完全是中国主权权利范围内的事
  • 湛江霞山通报渔船火灾:起火船舶共8艘,无人员伤亡或被困
  • 被流量绑架人生,《人生开门红》能戳破网络时代的幻象吗
  • 快评|印巴为何停火?已达成“一场胜利,各自表述”的效果
  • 图集︱“中国排面”威武亮相
  • 重庆大学通报本科生发14篇SCI论文处理结果