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

【嵌入式开发之标准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. 1、利用fclose()函数关闭文件,再重新用fopen()函数打开文件;

  2. 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】二进制文件的读写及实验

文本文件和二进制的区别 文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。‌ 编码方式&#xff1a;‌文本文件是基于字符编码的文件&#xff0c;‌常见的编码有ASCII编码、‌UNICODE编码等。‌这些编码将字符映射到特定的二进制值&#xff0c;‌使得字符可以…...

Arduino学习笔记1——IDE安装与起步

一、IDE安装 去浏览器直接搜索Arduino官网&#xff0c;点击Software栏进入下载界面&#xff0c;选择Windows操作系统&#xff1a; 新版IDE下载不需要提前勾选所下载的拓展包&#xff0c;下载好后直接点击安装即可。 安装好后打开Arduino IDE&#xff0c;会自动开始下载所需的…...

一个注解解决重复提交问题

一、前言 ​ 在应用系统中提交是一个极为常见的功能&#xff0c;倘若不加管控&#xff0c;极易由于用户的误操作或网络延迟致使同一请求被发送多次&#xff0c;从而生成重复的数据记录。针对用户的误操作&#xff0c;前端通常会实现按钮的 loading 状态&#xff0c;以阻…...

在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中的计算属性&#xff08;computed&#xff09;和方法&#xff08;methods&#xff09;都是用于处理数据和逻辑的重要特性&#xff0c;但它们之间存在一些关键的区别。以下是两者的主要区别&#xff1a; 1. 缓存性 计算属性&#xff1a;计算属性是基于它们的依赖进行缓存的…...

学生成绩管理系统(C语言)

系统分析 1. 主菜单的实现 2. 增加人员功能的实现 3. 删除数据功能的实现 4. 编辑人员功能的实现 5. 排序功能的实现 6. 输出功能 7. 查找信息功能 具体代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 100000typedef struc…...

C语言 通讯录管理 完整代码

这份代码&#xff0c;是我从网上找的。目前是能运行。我正在读。有些不懂的地方&#xff0c;等下再记录下来。 有些地方的命名&#xff0c;还需要重新写一下。 比如: PersonInfo* info &address_book->all_address[address_book->size]; 应该改为&#xff1a; Perso…...

2024北京国际智能工厂及自动化展览会亮点前瞻

随着“工业创新&#xff0c;智造未来”的浪潮席卷而来&#xff0c;2024年度北京国际智能工厂及自动化与工业装配展览会定于8月1日至3日在中国国际展览中心&#xff08;顺义新馆&#xff09;盛大开幕。本次展会汇聚了智能制造与自动化技术的最新成果&#xff0c;通过三展联动的创…...

《网络安全等级保护制度详解》

网络安全等级保护制度是我国网络安全领域的一项重要制度&#xff0c;旨在保障网络安全&#xff0c;维护国家安全、社会秩序和公共利益。 网络安全等级保护制度主要包含以下几个关键方面&#xff1a; 等级划分 根据信息系统在国家安全、经济建设、社会生活中的重要程度&#xff…...

使用Wanderboat AI 来规划到巴黎的旅行计划

​ Wanderboat AI 平台是一个由 GPT-4 驱动的智能旅行规划工具&#xff0c;旨在通过自然对话和多模式互动&#xff0c;为用户提供个性化的旅行行程。以下是该平台的架构和使用方法&#xff1a; 平台架构 GPT-4 驱动&#xff1a;平台利用 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中每一个对象所占用的空间大小&#xff0c;是在编译的时候就确定的&#xff0c;在模板类没有真正的被使用之前&#xff0c;编译器是无法知道&#xff0c;模板类中使用模板类型的对象的所占用的空间的大小的。只有模板被真正使用的时…...

Qt 快速保存配置的方法

Qt 快速保存配置的方法 一、概述二、代码1. QFileHelper.cpp2. QSettingHelper.cpp 三、使用 一、概述 这里分享一下&#xff0c;Qt界面开发时&#xff0c;快速保存界面上一些参数配置的方法。 因为我在做实验的时候&#xff0c;界面上可能涉及到很多参数的配置&#xff0c;我…...

RKE部署k8s

移除docker&#xff08;非必要&#xff09; 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.选择内部时钟模式&#xff0c;打开通道二 3.分频系数PSC:72-1 自动重装寄存器ARR:20000-1 输出比较寄存器 CCR:500~2500( 后面可调整 ) 脉冲选择500后期可以改 编辑代码 调用启动函数 HAL_TIM_PWM_Start(&htim2,TIM_CHANN…...

微信小程序数组绑定使用案例(一)

微信小程序数组绑定案例&#xff0c;修改数组中的值 1.Wxml 代码 <view class"list"><view class"item {{item.ischeck?active:}}" wx:for"{{list}}"><view class"title">{{item.name}} <text>({{item.id}…...

java毕业设计基于springboot+vue的电影院座位管理系统

前言 该系统旨在实现电影院座位的高效管理&#xff0c;包括座位预订、售票、座位状态实时监控等功能。通过该系统&#xff0c;电影院可以提高售票效率&#xff0c;优化座位使用率&#xff0c;同时为顾客提供便捷的购票体验。 一、项目介绍 开发语言&#xff1a;Java 框架&…...

ComfyUI-Easy-Use:让AI绘画工作流像搭积木一样简单

ComfyUI-Easy-Use&#xff1a;让AI绘画工作流像搭积木一样简单 【免费下载链接】ComfyUI-Easy-Use In order to make it easier to use the ComfyUI, I have made some optimizations and integrations to some commonly used nodes. 项目地址: https://gitcode.com/gh_mirro…...

Comsol热流耦合拓扑优化:最大化放热量与功率耗散的探索

Comsol热流耦合拓扑优化。 目标函数采用最大化放热量和功率耗散。在工程领域&#xff0c;热流耦合问题一直是研究的重点&#xff0c;尤其是如何通过拓扑优化来实现特定目标&#xff0c;比如最大化放热量和功率耗散&#xff0c;这对于提高系统性能至关重要。而Comsol作为一款强大…...

档案宝 档案管理系统怎么样?为什么企业选择他?

在当今信息化高速发展的时代&#xff0c;企业档案管理已经从传统的纸质化时代迈向了数字化、智能化的新阶段。随着企业规模的不断扩大和业务类型的日益复杂&#xff0c;档案管理面临着前所未有的挑战&#xff1a;档案数量激增、查找困难、存储空间紧张、安全隐患突出等问题严重…...

告别丑陋代码块!用PyQt5+pygments实现Word代码高亮粘贴(附完整源码)

告别丑陋代码块&#xff01;用PyQt5pygments实现Word代码高亮粘贴&#xff08;附完整源码&#xff09; 在技术文档编写过程中&#xff0c;代码展示是不可或缺的部分。然而&#xff0c;直接将IDE中的代码复制到Word文档时&#xff0c;往往会丢失原有的高亮和格式&#xff0c;变成…...

YOLOv11涨点改进| TPAMI 2026 |全网创新首发、注意力改进篇|引入ASSA自适应稀疏自注意力,顶刊万能涨点模块,含5种超强创新,适合目标检测,图像分割,图像分类,图像超分等任务高效涨点

一、本文介绍 🔥本文给大家介绍利用将 ASSA自适应稀疏自注意力模块改进 YOLOv11网络模型,可以显著提升模型的特征建模能力和复杂场景下的检测性能。ASSA通过自注意力机制在全局范围内建立不同空间位置之间的依赖关系,使网络能够充分利用全局上下文信息,从而增强特征表达能…...

WPS宏工具实战:5分钟搞定批量图片尺寸调整(JSA/VBA双版本代码)

WPS宏工具实战&#xff1a;5分钟搞定批量图片尺寸调整&#xff08;JSA/VBA双版本代码&#xff09; 在文档处理中&#xff0c;批量调整图片尺寸是个高频需求。想象一下&#xff0c;你手头有份50页的产品手册&#xff0c;每页都嵌入了不同尺寸的图片&#xff0c;而客户要求所有图…...

避坑指南:在RV1103B上为SC132GS摄像头添加设备树节点的正确姿势

RV1103B平台SC132GS摄像头设备树配置实战指南 1. 瑞芯微RV1103B平台摄像头开发概述 在嵌入式视觉系统开发中&#xff0c;瑞芯微RV1103B凭借其出色的图像处理能力和低功耗特性&#xff0c;成为工业视觉、智能门铃等场景的热门选择。SC132GS作为一款高性价比的1/3英寸CMOS传感器&…...

3步搞定Windows 11优化:用Win11Debloat让你的电脑更快更干净

3步搞定Windows 11优化&#xff1a;用Win11Debloat让你的电脑更快更干净 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以简…...

LyricsX:重构Mac音乐体验的智能歌词助手

LyricsX&#xff1a;重构Mac音乐体验的智能歌词助手 【免费下载链接】Lyrics Swift-based iTunes plug-in to display lyrics on the desktop. 项目地址: https://gitcode.com/gh_mirrors/lyr/Lyrics 当你在Mac上沉浸于音乐世界时&#xff0c;是否曾因无法同步显示歌词而…...