lv4 嵌入式开发-4 标准IO的读写(二进制方式)

目录

1 标准I/O – 按对象读写

2 标准I/O – 小结

3 标准I/O – 思考和练习


文本文件和二进制的区别:

存储的格式不同:文本文件只能存储文本。除了文本都是二进制文件。

补充计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001....,所以所有符号都要编码)

1 标准I/O – 按对象读写

下列函数用来从流中读写若干个对象:

#include  <stdio.h>size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
//void *ptr  读取内容放的位置指针
//size_t size 读取的块大小
//size_t n 读取的个数
//FILE *fp  读取的文件指针size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
//void *ptr  写文件的内容的位置指针
//size_t size 写的块大小
//size_t n 写的个数
//FILE *fp  要写的文件指针
  • 成功返回读写的对象个数;出错时返回EOF
  • 既可以读写文本文件,也可以读写数据文件
  • 效率高

标准I/O – fread/fwrite – 示例

 int s[10];if (fread(s, sizeof(int), 10, fp) < 0) {perror(“fread”);return  -1;}struct  student {int  no;char name[8];float  score;}  s[] = {{ 1, “zhang”, 97}, {2, “wang”, 95}};fwrite(s, sizeof(struct student), 2, fp);

fread示例 

#include <stdio.h>
#include <stdlib.h>
int main(int argc,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");goto end;}printf("buf=%s\n",buff); end:free(buff);fclose(fp);}//运行结果
buf=hello worl

 fwrite和fread读写二进制示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct student{char name[16];int age;char sex[8];
};int main(int argc,char *argv[]){FILE *fp;size_t ret;struct student stu;struct student stu2;fp=fopen("1.bin","w");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不关闭指针在最后,读取会乱,一定要重新打开。fp=fopen("1.bin","r");if(fp==NULL){perror("fopen");return 0;}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);}

vim只能查看文本文件,查看二进制文件会显示乱码

 

注意事项:

文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。

解决办法:移动指针(后面讲解)到文件头;关闭文件,重新打开

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct student{char name[16];int age;char sex[8];
};int main(int argc,char *argv[]){FILE *fp;size_t ret;struct student stu2;fp=fopen("1.bin","r");if(fp==NULL){perror("fopen");return 0;}ret = fread(&stu2,sizeof(stu2),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);}

2 标准I/O – 小结

fgetc / fputc        

fgets / fputs        

fread / fwrite

3 标准I/O – 思考和练习

如何利用fread / fwrite实现文件的复制?

通过命令行参数传递源文件和目标文件名

通过fread返回值判断是否读到文件末尾

#include <stdio.h>#define BUFFER_SIZE 4096int main() {FILE *sourceFile, *targetFile;char buffer[BUFFER_SIZE];size_t bytesRead;// 打开源文件sourceFile = fopen("source.txt", "rb");if (sourceFile == NULL) {printf("无法打开源文件。\n");return 1;}// 打开目标文件targetFile = fopen("target.txt", "wb");if (targetFile == NULL) {printf("无法创建目标文件。\n");fclose(sourceFile);return 1;}// 复制文件内容while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, sourceFile)) > 0) {fwrite(buffer, 1, bytesRead, targetFile);}// 关闭文件fclose(sourceFile);fclose(targetFile);printf("文件复制完成。\n");return 0;
}

 

使用标准IO写2个学生的结构体数据到文件

#include <stdio.h>
#include <string.h>typedef struct _student
{char name[16];int age;char sex[8];
}student;int main() {FILE *fp;student stu[2];student temp[2];size_t ret;strcpy(stu[0].name,"zhangsan");stu[0].age = 10;strcpy(stu[0].sex,"male");strcpy(stu[1].name,"lisi");stu[1].age = 11;strcpy(stu[1].sex,"female");fp = fopen("1.bin","w");if (fp == NULL) {perror("fopen");return 1;}ret = fwrite(stu,sizeof(student),2,fp);if(ret == -1){perror("fwrite");goto end;}else{printf("Write success\n");}fclose(fp);fp = fopen("1.bin","r");if (fp == NULL) {perror("fopen");return 1;}ret = fread(temp, sizeof(student), 2, fp);if(ret == -1){perror("fread");goto end;}printf("name=%s,age=%d,sex=%s\n",temp[0].name, temp[0].age, temp[0].sex);printf("name=%s,age=%d,sex=%s\n",temp[1].name, temp[1].age, temp[1].sex);
end:fclose(fp);return 0;
}

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

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

相关文章

肖sir__设计测试用例方法之正交表08_(黑盒测试)

设计测试用例方法之正交 一、正交表定义 正交试验设计法&#xff0c;是从大量的试验点中挑选出适量的、有代表性的点&#xff0c;应用依据迦罗瓦理论导出的“正交表”&#xff0c;合理的安排试验的一种科学的试验设计方法。 二、 正交常用的术语 指标&#xff1a;通常把判断试验…

OpenCV 12(图像直方图)

一、图像直方图 直方图可以让你了解总体的图像像素强度分布&#xff0c;其X轴为像素值&#xff08;一般范围为0~255&#xff09;&#xff0c;在Y轴上为图像中具有该像素值像素数。 - 横坐标: 图像中各个像素点的灰度级. - 纵坐标: 具有该灰度级的像素个数. 画出上图的直方图: …

【实践篇】Redis最强Java客户端(三)之Redisson 7种分布式锁使用指南

文章目录 0. 前言1. Redisson 7种分布式锁使用指南1.1 简单锁&#xff1a;1.2 公平锁&#xff1a;1.3 可重入锁&#xff1a;1.4 红锁&#xff1a;1.5 读写锁&#xff1a;1.6 信号量&#xff1a;1.7 闭锁&#xff1a; 2. Spring boot 集成Redisson 验证分布式锁3. 参考资料4. 源…

IntelliJ IDEA远程调试:使用IDEA Remote Debug进行高效调试的指南

引言 在开发分布式系统时&#xff0c;调试是一个重要但复杂的环节。开发者通常需要跨越多个服务、模块和线程来追踪和解决问题。在没有远程调试的情况下&#xff0c;许多开发者会在代码中添加各种日志语句&#xff0c;然后重新部署和上线来调试。这种方法不仅费时&#xff0c;…

Hive_Hive统计指令analyze table和 describe table

之前在公司内部经常会看到表的元信息的一些统计信息&#xff0c;当时非常好奇是如何做实现的。 现在发现这些信息主要是基于 analyze table 去做统计的&#xff0c;分享给大家 实现的效果某一个表中每个列的空值数量&#xff0c;重复值数量等&#xff0c;平均长度 具体的指令…

华为数据管理——《华为数据之道》

数据分析与开发 元数据是描述数据的数据&#xff0c;用于打破业务和IT之间的语言障碍&#xff0c;帮助业务更好地理解数据。 元数据是数据中台的重要的基础设施&#xff0c;元数据治理贯彻数据产生、加工、消费的全过程&#xff0c;沉淀了数据资产&#xff0c;搭建了技术和业务…

【C++模拟实现】手撕AVL树

【C模拟实现】手撕AVL树 目录 【C模拟实现】手撕AVL树AVL树的介绍&#xff08;百度百科&#xff09;AVL树insert函数的实现代码验证是否为AVL树AVL树模拟实现的要点易忘点AVL树的旋转思路 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.9.10 前言&#xff1a;本篇博客将…

python28种极坐标绘图函数总结

文章目录 基础图误差线等高线polar场图polar统计图非结构坐标图 &#x1f4ca;python35种绘图函数总结&#xff0c;3D、统计、流场&#xff0c;实用性拉满 matplotlib中的画图函数&#xff0c;大部分情况下只要声明坐标映射是polar&#xff0c;就都可以画出对应的极坐标图。但…

9、补充视频

改进后的dijkstra算法 利用小根堆 将小根堆特定位置更改,再改成小根堆 nodeHeap.addOrUpdateOrIgnore(edge.to, edge.weight + distance);//改进后的dijkstra算法 //从head出发,所有head能到达的节点,生成到达每个节点的最小路径记录并返回 public static HashMap<No…

c语言练习44:深入理解strstr

深入理解strstr strstr作用展示&#xff1a; #include <stdio.h> #include <string.h> int main() {char str[] "This is a simple string";char* pch;pch strstr(str, "simple");/*strncpy(pch, "sample", 6);*/printf("%s…

Nginx详解 第五部分:Ngnix反向代理(负载均衡 动静分离 缓存 透传 )

Part 5 一、正向代理与反向代理1.1 正向代理简介1.2 反向代理简介 二、配置反向代理2.1 反向代理配置参数2.1.1 proxy_pass2.1.2 其余参数 2.2 配置实例:反向代理单台web服务器2.3 代理转发 三、反向代理实现动静分离四、缓存功能五、反向代理客户端的IP透传5.1 原理概述5.2 一…

基于语雀编辑器的在线文档编辑与查看

概述 语雀是一个非常优秀的文档和知识库工具&#xff0c;其编辑器更是非常好用&#xff0c;虽无开源版本&#xff0c;但有编译好的可以使用。本文基于语雀编辑器实现在线文档的编辑与文章的预览。 实现效果 实现 参考语雀编辑器官方文档&#xff0c;其实现需要引入以下文件&…

Pandas 掉包侠刷题实战--条件筛选

本博文内容为力扣刷题过程的记录&#xff0c;所有题目来源于力扣。 题目链接&#xff1a;https://leetcode.cn/studyplan/30-days-of-pandas/ 文章目录 准备工作1. isin(values) 和 ~2. df.drop_duplicates()3. df.sort_values()4. df.rename()5. pd.merge() 题目-条件筛选1. 大…

入门人工智能 —— 使用 Python 进行文件读写,并完成日志记录功能(4)

入门人工智能 —— 使用 Python 进行文件读写&#xff08;4&#xff09; 入门人工智能 —— 使用 Python 进行文件读写打开文件读取文件内容读取整个文件逐行读取文件内容读取所有行并存储为列表 写入文件内容关闭文件 日志记录功能核心代码&#xff1a;完整代码&#xff1a;运…

RabbitMQ从入门到精通之安装、通讯方式详解

文章目录 RabbitMQ一、RabbitMQ介绍1.1 现存问题 一、RabbitMQ介绍二、RabbitMQ安装三、RabbitMQ架构四、RabbitMQ通信方式4.1 RabbitMQ提供的通讯方式4.2 Helloworld 方式4.2Work queues4.3 Publish/Subscribe4.4 Routing4.5 Topics4.6 RPC (了解) 五、Springboot 操作RabbitM…

【结合AOP与ReflectUtil对返回数据进行个性化填充展示】

结合AOP与ReflectUtil对返回数据进行个性化填充展示 背景 对于接口列表返回的数据&#xff0c;我们通常有时候会对某些特殊的字段进行转化&#xff0c;或者根据某逻辑进行重新赋值&#xff0c;举个例子&#xff0c; 比如返回的列表数据中有性别sex&#xff0c;我们通常会同时…

微信小程序实现连续签到七天

断签之后会从第一天重新开始 <template><view class"content" style"height: 100vh;background: white;"><view class"back"><view style"position: absolute;bottom: 200rpx;left: 40rpx;width: 90%;"><i…

无人机航线规划

无人机航线规划&#xff0c;对于无人机的任务执行有着至关重要的作用&#xff0c;无人机在从起点飞向目的点的过程中&#xff0c;如何规划出一条安全路径&#xff0c;并且保证该路径代价最优&#xff0c;是无人机航线规划的主要目的。其中路径最优的含义是&#xff0c;在无人机…

透视俄乌网络战之二:Conti勒索软件集团(上)

透视俄乌网络战之一&#xff1a;数据擦除软件 Conti勒索软件集团&#xff08;上&#xff09; 1. Conti简介2. 组织架构3. 核心成员4. 招募途径5. 工作薪酬6. 未来计划参考 1. Conti简介 Conti于2019年首次被发现&#xff0c;现已成为网络世界中最危险的勒索软件之一&#xff0…

goLang笔记+beego框架

goLang笔记+ 初始安装之后 GOPATH: Go开发相关的环境变量如下: GOROOT:GOROOT就是Go的安装目录,(类似于java的JDK) GOPATH:GOPATH是我们的工作空间,保存go项目代码和第三方依赖包 GOPATH可以设置多个,其中,第一个将会是默认的包目录,使用 go get 下载的包都会在第一…