如何进行二进制文件的读写操作?

在C语言中,进行二进制文件的读写操作是非常常见的任务,尤其在处理文件、图像、音频和视频等二进制数据时。本文将详细介绍如何进行二进制文件的读写操作,包括如何打开文件、读取文件、写入文件以及关闭文件。我们将使用标准C库中的函数来执行这些操作。

打开二进制文件

在进行二进制文件的读写操作之前,首先需要打开文件。在C语言中,可以使用fopen函数来打开文件。下面是fopen函数的基本用法:

FILE *fopen(const char *filename, const char *mode);
  • filename 是要打开的文件的名称,可以包括完整路径。
  • mode 是文件打开模式,包括 "r"(读取)、"w"(写入)、"a"(追加)、"rb"(二进制读取)、"wb"(二进制写入)等。对于二进制文件的读写,通常使用带有 "b" 后缀的模式。

以下是一个示例,演示如何打开一个二进制文件以进行读取:

#include <stdio.h>int main() {FILE *file;file = fopen("binary_file.bin", "rb"); // 以二进制读取模式打开文件if (file == NULL) {perror("Error opening file");return 1;}// 文件已成功打开,进行读取操作fclose(file); // 关闭文件return 0;
}

在示例中,我们使用了 "rb" 模式来以二进制读取方式打开文件 "binary_file.bin"。如果文件打开成功,fopen 函数将返回一个指向 FILE 结构的指针,否则返回 NULL。在打开文件后,我们可以进行读取操作。

读取二进制文件

一旦打开了二进制文件,就可以使用不同的函数来读取文件中的数据。最常见的函数是fread,它用于从文件中读取二进制数据。以下是fread 函数的基本用法:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
  • ptr 是一个指向用于存储数据的内存缓冲区的指针。
  • size 是每个数据项的字节数。
  • count 是要读取的数据项的数量。
  • stream 是指向已打开文件的指针。

fread 函数返回成功读取的数据项数量。通常,您可以使用sizeof操作符来计算size参数,以确保正确地读取所需数量的数据项。

以下是一个示例,演示如何使用fread函数从二进制文件中读取数据:

 
#include <stdio.h>int main() {FILE *file;file = fopen("binary_file.bin", "rb");if (file == NULL) {perror("Error opening file");return 1;}// 读取10个整数(每个整数占4字节)int data[10];size_t items_read = fread(data, sizeof(int), 10, file);if (items_read != 10) {perror("Error reading file");return 1;}// 处理读取的数据fclose(file); // 关闭文件return 0;
}

在示例中,我们打开了一个文件并使用fread函数从中读取了10个整数。fread函数将数据读取到名为 data 的整数数组中。

写入二进制文件

除了读取,您还可以使用不同的函数来将数据写入二进制文件。最常见的函数是fwrite,它用于将数据写入文件。以下是fwrite 函数的基本用法:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
  • ptr 是一个指向包含要写入文件的数据的内存缓冲区的指针。
  • size 是每个数据项的字节数。
  • count 是要写入的数据项的数量。
  • stream 是指向已打开文件的指针。

fwrite 函数返回成功写入的数据项数量。同样,您可以使用sizeof操作符来计算size参数,以确保正确地写入所需数量的数据项。

以下是一个示例,演示如何使用fwrite函数将数据写入二进制文件:

#include <stdio.h>int main() {FILE *file;file = fopen("binary_file.bin", "wb"); // 以二进制写入模式打开文件if (file == NULL) {perror("Error opening file");return 1;}// 要写入的数据int data[] = {1, 2, 3, 4, 5};size_t items_written = fwrite(data, sizeof(int), 5, file);if (items_written != 5) {perror("Error writing file");return 1;}fclose(file); // 关闭文件return 0;
}

在示例中,我们打开了一个文件并使用fwrite函数将一个整数数组写入文件。fwrite函数将数组中的数据写入文件,每个整数占4字节。

关闭二进制文件

在完成二进制文件的读写操作后,务必关闭文件,以释放文件资源并确保数据已被刷新到磁盘。要关闭文件,可以使用fclose函数,如下所示:

int fclose(FILE *stream);
  • stream 是指向已打开文件的指针。

以下是一个示例,演示如何关闭二进制文件:

#include <stdio.h>int main() {FILE *file;file = fopen("binary_file.bin", "rb");if (file == NULL) {perror("Error opening file");return 1;}// 读取文件数据fclose(file); // 关闭文件return 0;
}

在示例中,我们使用fclose函数关闭了已打开的二进制文件。关闭文件后,不能再执行文件的读写操作。

错误处理

在进行二进制文件的读写操作时,要时刻注意错误处理。打开文件、读取数据和写入数据都可能导致错误。为了有效地处理错误,可以使用perror函数来输出错误信息,或使用errno全局变量来获取错误代码。

以下是一个示例,演示如何使用perror函数来处理文件操作中的错误:

#include <stdio.h>
#include <errno.h>int main() {FILE *file;file = fopen("non_existent_file.bin", "rb");if (file == NULL) {perror("Error opening file");printf("Error code: %d\n", errno);return 1;}// 读取文件数据fclose(file); // 关闭文件return 0;
}

在示例中,我们故意尝试打开一个不存在的文件,并使用perror函数输出错误信息和errno变量来获取错误代码。这有助于识别问题并进行适当的错误处理。

总结

进行二进制文件的读写操作是C语言中的常见任务。在处理文件时,您需要打开文件、读取数据、写入数据和关闭文件。使用标准C库函数,如fopenfreadfwritefclose,您可以轻松地执行这些操作。同时,要时刻注意错误处理,以确保文件操作不出现问题。二进制文件的读写操作是处理各种文件和数据的关键部分,掌握这些技巧对于C程序员来说非常重要。希望这篇文章对您有所帮助。

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

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

相关文章

行为型模式-空对象模式

在空对象模式&#xff08;Null Object Pattern&#xff09;中&#xff0c;一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值&#xff0c;而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式中&#xff0c;我…

性能测试jmeter命令行运行+html测试报告解读

windows下打开jmeter的运行窗口&#xff0c;可以看到提示不要用GUI模式进行负载测试&#xff0c;如果要用负载测试&#xff0c;用cli模式&#xff0c;因为GUI模式运行jmeter比较消耗性能。 命令行模式 windows下找到jemeter所在文件夹&#xff0c;打开cmd输入命令。 jmeter -n…

Centos安装gitlabce

服务器配置要求&#xff08;2c4g&#xff09; 1、 安装其他组件 yum install -y curl policycoreutils-python openssh perl2、 安装Postfix服务以发送电子邮件通知&#xff0c;启动服务并自启 yum -y install postfix systemctl enable postfix --now3、 安装gitlab&#xf…

Docker容器端口在主机的映射

Docker容器端口在主机的映射 Docker 允许你在启动容器时进行多个端口映射&#xff0c;以便将容器内部的端口映射到宿主机上的不同端口。你可以使用-p或--publish标志来指定端口映射。以下是一些示例&#xff0c;说明如何在 Docker 启动容器时进行多个端口映射&#xff1a; 映…

Linux系统之file命令的基本使用

Linux系统之file命令的基本使用 一、file命令介绍1.1 Linux简介1.2 file命令简介 二、file命令的使用帮助2.1 file命令的help帮助信息2.2 file命令的语法解释2.3 file命令的man手册 三、文件类型介绍四、file命令的基本使用4.1 查询file版本4.2 显示文件类型4.3 输出时不显示文…

Ubuntu 安装 docker-compose

在Ubuntu上安装Docker Compose&#xff0c;可以按照以下步骤进行操作&#xff1a; 下载 Docker Compose 二进制文件 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker…

进阶第1章代码解读

目录 forward_net.py代码代码解读debug 代码 forward_net.py 代码 # coding: utf-8 import numpy as npclass Sigmoid:def __init__(self):self.params []def forward(self, x):return 1 / (1 np.exp(-x))class Affine:def __init__(self, W, b):self.params [W, b]def fo…

39.B树,B+树(王道第7章查找补充知识)

目录 一. B树 &#xff08;1&#xff09;B树的定义 &#xff08;2&#xff09;B树的高度 &#xff08;3&#xff09;B树的插入 &#xff08;4&#xff09;B树的删除 二. B树 &#xff08;1&#xff09;B树的定义 &#xff08;2&#xff09;B树与B树的区别 一. B树 &am…

Java架构师内功计算机网络

目录 1 导学2 网络功能和分类3 OSI七层模型3.1 局域网和广域网协议4 TCP/IP协议5 通信技术和交换技术5.1 通信技术5.2 交换技术5.2.1 路由技术5.2.2 传输介质6 通信方式和交换方式7 IP地址7.1 IP地址表示7.2 子网划分8 IPv69 网络规划与设计10 网络存储技术10.1 廉价磁盘几余阵…

软件测试进阶篇----自动化测试脚本开发

自动化测试脚本开发 一、自动化测试用例开发 1、用例设计需要注意的点 2、设计一条测试用例 二、脚本开发过程中的技术 1、线性脚本开发 2、模块化脚本开发&#xff08;封装线性代码到方法或者类中。在需要的地方进行调用&#xff09; 3、关键字驱动开发&#xff1a;selen…

【云原生之kubernetes实战】在k8s环境下部署moredoc文库系统

【云原生之kubernetes实战】在k8s环境下部署moredoc文库系统 一、moredoc介绍1.1 moredoc简介1.2 moredoc技术栈二、本次实践介绍2.1 本次实践简介2.2 本次环境规划三、检查k8s环境3.1 检查工作节点状态3.2 检查系统pod状态四、创建mysql的secret资源4.1 创建部署目录4.2 创建密…

rust学习——智能指针

智能指针 在各个编程语言中&#xff0c;指针的概念几乎都是相同的&#xff1a;指针是一个包含了内存地址的变量&#xff0c;该内存地址引用或者指向了另外的数据。 在 Rust 中&#xff0c;最常见的指针类型是引用&#xff0c;引用通过 & 符号表示。不同于其它语言&#xf…

【可视化Java GUI程序设计教程】第4章 布局设计

4.1 布局管理器概述 右击窗体&#xff0c;单击快捷菜单中的Set Layout 4.1.2 绝对布局&#xff08;Absolute Layout&#xff09; 缩小窗口发现超出窗口范围的按钮看不见 Absolute Layout 4.1.2 空值布局&#xff08;Null Layout&#xff09; 4.1.3 布局管理器的属性和组件布…

python获取安卓Hierarchy并解析

python获取安卓Hierarchy并解析 借助 uiautomator 命令 dump 当前页面的 ui hierarchy 信息 完整的 uiautomator 命令类似&#xff1a; adb shell uiautomator dump [--compressed] [file]解析需要使用&#xff1a;import xml.etree.ElementTree as ET 完整代码如下&#xff…

STM32-通用定时器

通用定时器 通用定时器由一个可编程预分频器驱动的16位自动重新加载计数器组成。应用&#xff1a;测量输入的脉冲长度信号&#xff08;输入捕获&#xff09;、产生输出波形&#xff08;输出比较和PWM&#xff09;。 脉冲长度和波形周期可以从几微秒调制到几毫秒&#xff0c;使用…

SQL 运算符

SQL 运算符 运算符是保留字或主要用于 SQL 语句的 WHERE 子句中的字符&#xff0c;用于执行操作&#xff0c;例如&#xff1a;比较和算术运算。 这些运算符用于指定 SQL 语句中的条件&#xff0c;并用作语句中多个条件的连词。 常见运算符有以下几种&#xff1a; 算术运算符比…

STM32:TIM通道输入捕获

本文主要讲解如何使用TIMER通道的输入脉冲捕获功能。基于STM32F7的Timer2 Channel3来进行讲解。 配置时钟 Timer2的时钟频率&#xff0c;对应APB1 Timer。 分频设置为96-1&#xff0c;这样设置定时器每次counter加1&#xff0c;对应的时间为1us&#xff08;计时精度是1us&…

【windows】自动开机 + 免登陆 + 自动运行bat脚本 + 远程免登陆

一、场景 二、解决方案 三、实战 1. 键盘 Win R 键&#xff0c;在弹出的对话框中输入netplwiz&#xff0c;回车 2. 去掉必须输入用户名和密码的勾选&#xff0c;点击应用 3. 在弹出的对话框中输入用户名和密码 一、场景 主机服务器&#xff1a;windows 10 桌面docker &a…

程序包com.sun.xml.internal.bind.marshaller不存在

程序包com.sun.xml.internal.bind.marshaller不存在 需要引入的依赖 <dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId><version>1.3.50</version></dependency><dependency&g…

【蓝桥每日一题]-贪心(保姆级教程 篇1)#拼数 #合并果子 #凌乱yyy

目录 题目&#xff1a; 拼数 思路&#xff1a; 题目&#xff1a; 合并果子 思路&#xff1a; 题目&#xff1a;凌乱yyy 思路&#xff1a; 题目&#xff1a;拼数 思路&#xff1a; 思路很简单。举个例子&#xff1a;对于a321,b32。我们发现ab32132,ba32321&#xff0c;那么…