【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. 跨平台兼容:二进制文件在不同系统间可能存在字节序差异(如小端存储)参考文章。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20982.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WIN系统服务器如何修改远程端口?

在Windows服务器上修改远程桌面协议&#xff08;RDP&#xff09;的默认端口&#xff08;3389&#xff09;可以增强服务器的安全性&#xff0c;减少被恶意扫描和攻击的风险。以下是修改远程端口的详细步骤&#xff1a; --- ### **步骤 1&#xff1a;通过注册表修改远程端口** …

使用Termux将安卓手机变成随身AI服务器(page assist连接)

通过以下方法在安卓手机上运行 Ollama 及大模型&#xff0c;无需 Root 权限&#xff0c;具体方案如下&#xff1a; 通过 Termux 模拟 Linux 环境运行 核心工具&#xff1a; 安装 &#xff08;安卓终端模拟器&#xff09;()]。借助 proot-distro 工具安装 Linux 发行版&#xf…

【Prometheus】prometheus结合pushgateway实现脚本运行状态监控

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

《运维工程师如何利用DeepSeek实现智能运维:分级实战指南》

目录 智能运维革命:DeepSeek带来的范式转变DeepSeek核心运维能力全景解析分级实战场景与解决方案 3.1 初级工程师:自动化运维入门3.2 中级工程师:复杂系统诊断与优化3.3 高级工程师:架构级智能运维典型项目案例深度剖析 4.1 金融系统全链路监控体系构建4.2 电商大促资源弹性…

elementui中aria-hidden报错

浏览器检查的原因&#xff0c;不影响功能&#xff0c;但会在控制台报红 解决办法&#xff1a; 在对应元素设置display:none .el-radio__original {display: none !important;}

重构谷粒商城07:Git一小时快速起飞指南

重构谷粒商城07&#xff1a;Git一小时快速起飞指南 前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff…

关于人工智能的学习方向应该怎么选择

目前AI-人工智能主流方向和应用场景的判断有哪些呢&#xff1f;学习方向与建议&#xff08;根据自身情况而定&#xff09;总结 人工智能-AI从2023年开始逐渐的在整个行业传播被大家所推崇&#xff0c;再根据这两年人工智能不断迭代更新&#xff0c;特别是DeepSeek的横空出世让国…

Huatuo热更新--如何使用

在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main&#xff08;可自定义&#xff09;&#xff0c;然后按下图创建文件&#xff0c;注意名称与文件夹名称保持一致 然后新建场景&#xff08;Init场景&#xff09;&#xff0c;添加3个空物体…

DeepSeek 和 ChatGPT 在特定任务中的表现:逻辑推理与创意生成

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…

车载音频配置(二)

目录 OEM 自定义的车载音频上下文 动态音频区配置 向前兼容性 Android 14 车载音频配置 在 Android 14 中,AAOS 引入了 OEM 插件服务,使你可以更主动地管理由车载音频服务监督的音频行为。 随着新的插件服务的引入,车载音频配置文件中添加了以下更改: • OEM 自定义的车…

【SQL】SQL多表查询

多表查询案例联系点击此处 &#x1f384;概念 一般我们说的多表查询都涉及外键和父子表之间的关系。比如一对多:一般前面指的是父表后面指的是子表。 ⭐分类 一对多(多对一) 多对多 一对一 ⭐一对多 &#x1f4e2;案例&#xff1a;部门与员工的关系 &#x1f4e2;关系&…

存储区域网络(SAN)管理

存储区域网络&#xff08;Storage Area Network&#xff0c;SAN&#xff09;采用网状通道&#xff08;Fibre Channel &#xff0c;简称FC&#xff09;技术&#xff0c;通过FC交换机连接存储阵列和服务器主机&#xff0c;建立专用于数据存储的区域网络。SAN提供了一种与现有LAN连…

导出指定文件夹下的文件结构 工具模块-Python

python模块代码 import os import json import xml.etree.ElementTree as ET from typing import List, Optional, Dict, Union from pathlib import Path class DirectoryTreeExporter:def __init__(self,root_path: str,output_file: str,fmt: str txt,show_root: boo…

PyCharm Terminal 自动切换至虚拟环境

PyCharm 虚拟环境配置完毕后&#xff0c;打开终端&#xff0c;没有跟随虚拟环境切换&#xff0c;如图所示&#xff1a; 此时&#xff0c;需要手动将终端切换为 Command Prompt 模式 于是&#xff0c;自动切换至虚拟环境 每次手动切换&#xff0c;比较麻烦&#xff0c;可以单…

Vue 实现通过URL浏览器本地下载 PDF 和 图片

1、代码实现如下&#xff1a; 根据自己场景判断 PDF 和 图片&#xff0c;下载功能可按下面代码逻辑执行 const downloadFile async (item: any) > {try {let blobUrl: any;// PDF本地下载if (item.format pdf) {const response await fetch(item.url); // URL传递进入i…

【前端】使用WebStorm创建第一个项目

文章目录 前言一、步骤1、启动2、创建项目3、配置Node.js4、运行项目 二、Node.js介绍 前言 根据前面文章中记录的步骤&#xff0c;已经安装好了WebStorm开发软件&#xff0c;接下来我们就用这个IDE开发软件创建第一个项目。 一、步骤 1、启动 启动软件。 2、创建项目 新建…

遥感与GIS在滑坡、泥石流风险普查中的实践技术应用

原文>>> 遥感与GIS在滑坡、泥石流风险普查中的实践技术应用 我国是地质灾害多发国家&#xff0c;地质灾害的发生无论是对于地质环境还是人类生命财产的安全都会带来较大的威胁&#xff0c;因此需要开展地质灾害风险普查。利用遥感&#xff08;RS&#xff09;技术进行地…

EasyExcel 自定义头信息导出

需求&#xff1a;需要在导出 excel时&#xff0c;合并单元格自定义头信息(动态生成)&#xff0c;然后才是字段列表头即导出数据。 EasyExcel - 使用table去写入&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E4%BD%BF%E7%94%A8table%E…

QT异步编程之QMetaObject::invokeMethod

一、概述 1、QMetaObject::invokeMethod是Qt的一个功能强大的方法&#xff0c;它用于动态地调用一个对象地槽函数或成员函数。 2、这个方法允许你在运行时通过对象地元对象系统调用函数&#xff0c;而无需直接使用函数指针或其它静态机制。 3、元对象系统是一个基于C的扩展…

斐波那契数列模型:在动态规划的丝绸之路上追寻斐波那契的足迹(上)

文章目录 引言递归与动态规划的对比递归解法的初探动态规划的优雅与高效自顶向下的记忆化搜索自底向上的迭代法 性能分析与比较小结 引言 斐波那契数列&#xff0c;这一数列如同一条无形的丝线&#xff0c;穿越千年时光&#xff0c;悄然延续其魅力。其定义简单而优美&#xff…