【嵌入式开发之标准I/O】二进制文件的读写及实验
文本文件和二进制的区别
文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。
-
编码方式:文本文件是基于字符编码的文件,常见的编码有ASCII编码、UNICODE编码等。这些编码将字符映射到特定的二进制值,使得字符可以在计算机中存储和传输。相比之下,二进制文件是基于值编码的文件,可以根据具体应用指定某个值的意义,这是一个自定义编码的过程。这意味着二进制文件可以存储任何类型的数据,包括文本、图像、音频等,而文本文件则主要存储字符数据。
-
数据组织方式:文本文件中的数据都是以字符的形式进行组织,通常可以逐行或全部读取到一个字符串变量中。这意味着文本文件的内容可以直接被人阅读,因为它们是按照特定的字符编码规则进行组织的。二进制文件则以数据的数据类型按照特定格式进行组织,必须根据其中保存的信息数据类型进行读取。二进制文件的内容通常无法直接阅读,需要特定的软件或程序来解释和显示其内容。
-
存储和读取:文本工具打开一个文件时,会读取文件物理上所对应的二进制比特流,然后按照所选择的解码方式来解释这个流,然后将解释结果显示出来。这意味着,即使是文本工具打开二进制文件,如果解码和编码不匹配,也会出现乱码。相比之下,二进制文件的存取与文本文件的存取差不多,只是编/解码方式不同而已。
-
优缺点:文本文件的编码基于字符定长,译码容易;而二进制文件的编码是变长的,存储利用率高,但译码难一些。文本文件通常更容易被人类阅读和理解,而二进制文件则更适合存储大量的数据和复杂的信息,如图像、音频等
二进制读写函数
二进制读取函数:fread()
size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
- 1、void *ptr:读取内容放的位置指针
- 2、size_t size:读取的块大小
- 3、size_t n:读取的个数
- 4、FILE *fp :读取的文件指针
-
二进制读取函数实验代码
-
#include <stdio.h> #include <stdlib.h>int main(int argc, const char *argv[]) {FILE *fp;char *buff;size_t ret;fp = fopen("1.txt", "r");if (fp == NULL) {perror("fopen");return 0;}buff = (char *)malloc(100);if (buff == NULL) {return 0;}ret = fread(buff, 10, 1, fp);if (ret == -1) {perror("fread");fclose(fp);return 0;}printf("buff = %s\n", buff);free(buff);fclose(fp);return 0; }文件内容
-
abcdefghi aaaa bbb cc e -
运行结果
-
buff = abcdefghi注意事项(文件指针回到文件头)
-
文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。
-
针对这个问题,有两种解决办法:
-
1、利用fclose()函数关闭文件,再重新用fopen()函数打开文件;
-
2、调用rewind(FILE *stream)函数。
-
二进制写入函数:fwrite()
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
- 1、void *ptr:写文件的内容的位置指针
- 2、size_t size:写的块大小
- 3、size_t n:写的个数
- 4、FILE *fp:要写的文件指针
-
二进制写入函数实验代码
-
#include <stdio.h> #include <stdlib.h> #include <string.h>struct student {char name[16];int age;char sex[8]; }stu, stu2;int main(int argc, const char *argv[]) {FILE *fp;size_t ret;fp = fopen("write.bin", "a+");if (fp == NULL) {perror("fopen");return 0;}strcpy(stu.name, "zhangsan");stu.age = 49;strcpy(stu.sex, "male");ret = fwrite(&stu, sizeof(stu), 1, fp);if (ret == -1) {perror("fwrite");goto end;} else {printf("write struct student success.\n");}/*fclose(fp);fp = fopen("write.bin", "a+");if (fp == NULL) {perror("fopen");return 0;}*/rewind(fp);//文件指针回到文件头ret = fread(&stu2, sizeof(stu), 1, fp);if (ret == -1) {perror("fread");goto end;}printf("name = %s, age = %d, sex = %s\n", stu2.name, stu2.age, stu2.sex); end:fclose(fp);return 0; }运行结果
-
write struct student success. name = zhangsan, age = 49, sex = male结构体数组写入二进制文件并读取
-
实现代码
-
#include <stdio.h> #include <stdlib.h> #include <string.h>#define FNAME "stu.bin" #define MODE "w+" #define NUM 2struct students {char name[16];int age;char sex[8];char phone[11]; }stu[NUM];//定义一个结构体,并声明一个结构体数组stuint main(int argc, const char *argv[]) {FILE *fp;int i;//打开文件,如果打开失败,直接返回if ((fp = fopen(FNAME, MODE)) == NULL) {perror("fopen");return 0;}//从键盘输入学生信息,并且逐一写入到文件,写入失败输出提示信息,关闭文件for (i = 0; i < NUM; i++) {scanf("%s%d%s%s", stu[i].name, &stu[i].age, stu[i].sex, stu[i].phone);if ((fwrite(&stu[i], sizeof(struct students), 1, fp)) == -1) {perror("fwrite");goto end;}}/*fclose(fp);//写入完毕关闭文件//重新打开文件,如果打开失败,直接返回if ((fp = fopen(FNAME, MODE)) == NULL) {perror("fopen");return 0;}*/rewind(fp);//文件指针回到文件头//以学生为单位从文件中读取信息,并输出到屏幕,如果读取失败输出提示信息,关闭文件for (i = 0; i < NUM; i++) {if ((fread(&stu[i], sizeof(struct students), 1, fp)) == -1) {perror("fread");goto end;}printf("Student %s's message:\n", stu[i].name);printf("age = %d, sex = %s, phone = %s\n", stu[i].age, stu[i].sex, stu[i].phone);}end:fclose(fp);return 0; }运行结果
-
zhangsan 18 male 15900000000 lisi 19 female 13300909999 Student zhangsan's message: age = 18, sex = male, phone = 15900000000 Student lisi's message: age = 19, sex = female, phone = 13300909999
相关文章:
【嵌入式开发之标准I/O】二进制文件的读写及实验
文本文件和二进制的区别 文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。 编码方式:文本文件是基于字符编码的文件,常见的编码有ASCII编码、UNICODE编码等。这些编码将字符映射到特定的二进制值,使得字符可以…...
Arduino学习笔记1——IDE安装与起步
一、IDE安装 去浏览器直接搜索Arduino官网,点击Software栏进入下载界面,选择Windows操作系统: 新版IDE下载不需要提前勾选所下载的拓展包,下载好后直接点击安装即可。 安装好后打开Arduino IDE,会自动开始下载所需的…...
一个注解解决重复提交问题
一、前言 在应用系统中提交是一个极为常见的功能,倘若不加管控,极易由于用户的误操作或网络延迟致使同一请求被发送多次,从而生成重复的数据记录。针对用户的误操作,前端通常会实现按钮的 loading 状态,以阻…...
在qt的c++程序嵌入一个qml窗口
//拖拽一个QQuickWidget c端和qml通信的桥梁 找到qml的main.qml的路径 ui->quickWidget->setSource(QUrl::fromLocalFile("../../../code/main.qml"));// QML 与 Qt Widgets 通信//窗口就成了一个类实例对象pRoot (QObject*)ui->quickWidget->rootObje…...
Vue的依赖注入:组件树中的共享数据与功能
引言 在构建大型前端应用时,组件间的通信和状态共享是一个常见问题。Vue.js 提供了一种类似于 React 的 Context 机制的依赖注入系统,允许开发者在组件树中共享数据和功能。provide 和 inject 是 Vue 依赖注入的两个关键概念。本文将深入探讨 Vue 的依赖注入机制,讨论如何使…...
softmax 函数的多种实现方式 包括纯C语言、C++版本、Eigen版本等
softmax 函数的多种实现方式 包括纯C语言、C版本、Eigen版本等 flyfish 先看这里Softmax函数介绍 版本1 规矩的写法 #include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <cmath>// 计算 softmax 的函…...
R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件
R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件 读取csv使用base的 read.csv 函数使用 readr 包的 read_csv 函数 读取xlsx使用 xlsx 包的 read.xlsx 函数使用 readxl 包的 read_excel 函数 读取txt使用base的文件读取函数 readLines使用 readr 包的 read_lines 函数 …...
Vue的计算属性和方法有什么区别
Vue中的计算属性(computed)和方法(methods)都是用于处理数据和逻辑的重要特性,但它们之间存在一些关键的区别。以下是两者的主要区别: 1. 缓存性 计算属性:计算属性是基于它们的依赖进行缓存的…...
学生成绩管理系统(C语言)
系统分析 1. 主菜单的实现 2. 增加人员功能的实现 3. 删除数据功能的实现 4. 编辑人员功能的实现 5. 排序功能的实现 6. 输出功能 7. 查找信息功能 具体代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 100000typedef struc…...
C语言 通讯录管理 完整代码
这份代码,是我从网上找的。目前是能运行。我正在读。有些不懂的地方,等下再记录下来。 有些地方的命名,还需要重新写一下。 比如: PersonInfo* info &address_book->all_address[address_book->size]; 应该改为: Perso…...
2024北京国际智能工厂及自动化展览会亮点前瞻
随着“工业创新,智造未来”的浪潮席卷而来,2024年度北京国际智能工厂及自动化与工业装配展览会定于8月1日至3日在中国国际展览中心(顺义新馆)盛大开幕。本次展会汇聚了智能制造与自动化技术的最新成果,通过三展联动的创…...
《网络安全等级保护制度详解》
网络安全等级保护制度是我国网络安全领域的一项重要制度,旨在保障网络安全,维护国家安全、社会秩序和公共利益。 网络安全等级保护制度主要包含以下几个关键方面: 等级划分 根据信息系统在国家安全、经济建设、社会生活中的重要程度ÿ…...
使用Wanderboat AI 来规划到巴黎的旅行计划
Wanderboat AI 平台是一个由 GPT-4 驱动的智能旅行规划工具,旨在通过自然对话和多模式互动,为用户提供个性化的旅行行程。以下是该平台的架构和使用方法: 平台架构 GPT-4 驱动:平台利用 GPT-4 的强大自然语言处理能力&#x…...
基于YOLO8的目标检测系统:开启智能视觉识别之旅
文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 target_dec_app.py 二、核心代码介绍篇2.1 target_dec_app.py2.2 scan_taskflow.py 三、结语 在线体验 基于YOLO8的目标检测系统 基于opencv的摄像头…...
实验07 接口测试postman
目录 知识点 1 接口测试概念 1.1为什么要做接口测试 1.2接口测试的优点 1.3接口测试概念 1.4接口测试原理和目的 2 接口测试内容 2.1测什么 2.1.1单一接口 2.1.2组合接口 2.1.3结构检查 2.1.4调用方式 2.1.5参数格式校验 2.1.6返回结果 2.2四大块 2.2.1功能逻辑…...
C++常用但难记的语法
模板函数的声明和定义必须在同一个文件中。 C中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的。只有模板被真正使用的时…...
Qt 快速保存配置的方法
Qt 快速保存配置的方法 一、概述二、代码1. QFileHelper.cpp2. QSettingHelper.cpp 三、使用 一、概述 这里分享一下,Qt界面开发时,快速保存界面上一些参数配置的方法。 因为我在做实验的时候,界面上可能涉及到很多参数的配置,我…...
RKE部署k8s
移除docker(非必要) rm -rf /etc/docker rm -rf /run/docker rm -rf /var/lib/dockershim rm -rf /var/lib/docker yum list installed | grep docker yum remove ***rke部署k8s集群 cat > /etc/sysctl.conf << EFO net.ipv4.ip_forward 1 n…...
从0开始的STM32HAL库学习8
PWM控制舵机 配置环境 1. 选择TIM2时钟 2.选择内部时钟模式,打开通道二 3.分频系数PSC:72-1 自动重装寄存器ARR:20000-1 输出比较寄存器 CCR:500~2500( 后面可调整 ) 脉冲选择500后期可以改 编辑代码 调用启动函数 HAL_TIM_PWM_Start(&htim2,TIM_CHANN…...
微信小程序数组绑定使用案例(一)
微信小程序数组绑定案例,修改数组中的值 1.Wxml 代码 <view class"list"><view class"item {{item.ischeck?active:}}" wx:for"{{list}}"><view class"title">{{item.name}} <text>({{item.id}…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
