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

news2025/2/28 20:25:59

目录

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 4096

int 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.coloradmin.cn/o/997411.html

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

相关文章

2023/09/10

文章目录 1. 使用Vue单页面全局变量注意事项2. 伪元素和伪类3. Vue3中定义数组通常使用ref4. Vue Router的 $router 和 $route5. Vue路由中的query和params的区别6. vue3defineExpose({})属性不能重命名&#xff0c;方法可以重命名7. 显卡共享内存的原理8. deltaY9. 快速生成方…

电池2RC模型 + 开路电压法 + 安时积分 + 电池精度测试 + HPPC脉冲

电池2RC模型 电池2RC模型是一种等效电路模型&#xff0c;用于描述电池的动态特性。该模型将电池视为一个理想电容器和一个理想电阻的并联&#xff0c;其中理想电容器代表电池的化学反应&#xff0c;理想电阻代表电池的内阻。该模型适用于描述电池的充电和放电过程。 开路电压…

Java中如何判断字符串输入[hello,world]是不是字符串数组参数

Java中如何判断字符串输入[hello,world]是不是字符串数组参数&#xff1f; 在Java中&#xff0c;可以使用正则表达式来判断一个字符串是否符合字符串数组的参数格式。你可以使用matches()方法和对应的正则表达式进行判断。 以下是一个示例代码&#xff1a; public static bo…

SpringCloudGateway网关实战(二)

SpringCloudGateway网关实战&#xff08;二&#xff09; 本文我们在前文的基础上&#xff0c;开始讲gateway过滤器的部分内容。gateway的过滤器分为内置过滤器Filter和全局过滤器GlobalFilter。本章节先讲内置过滤器Filter。 需要先声明一下内置过滤器和全局过滤器之间的区别…

mysql文档--innodb中的重头戏--事务隔离级别!!!!--举例学习--现象演示

阿丹&#xff1a; 先要说明一点就是在网上现在查找的mysql中的事务隔离级别其实都是在innodb中的事务隔离级别。因为在mysql的5.5.5版本后myisam被innodb打败&#xff0c;从此innodb成为了mysql中的默认存储引擎。所以在网上查找的事务隔离级别基本上都是innodb的。并且支持事务…

JavaScript基础10——获取数据类型、类型转换

哈喽&#xff0c;大家好&#xff0c;我是雷工。 现如今知识大爆炸&#xff0c;到处都有海量的知识&#xff0c;常常见了就收藏&#xff0c;把网盘塞得满满的&#xff0c;却从来没有看过。 收藏起来装到网盘里并没有什么软用&#xff0c;要把知识装到脑袋里才行。 从几分钟开始&…

【LeetCode-中等题】26. 删除有序数组中的重复项

文章目录 题目方法一&#xff1a;快慢指针 题目 方法一&#xff1a;快慢指针 class Solution { //快慢指针public int removeDuplicates(int[] nums) {int fast 1;int slow 0;while(fast < nums.length){if(nums[fast] nums[fast-1]) fast;//若当前元素和之前元素相同 则…

华为OD机试 - 战场索敌 - 深度优先搜索dfs算法(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、深度优先搜索dfs五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明4、如果增加目标敌人数量K为55、来&#xff0c;上强度 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 有一个大小是N*M…

ros_launch配置

创建launch文件批运行节点和包 将以下四条指令写入launch文件中 获取软件包的完整指令 rospackpkg&#xff1a;软件包名字 type&#xff1a;节点名字 四条指令转化成launch文件

无人机航线规划

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

大数据-玩转数据-Flink 容错机制

一、概述 在分布式架构中&#xff0c;当某个节点出现故障&#xff0c;其他节点基本不受影响。在 Flink 中&#xff0c;有一套完整的容错机制&#xff0c;最重要就是检查点&#xff08;checkpoint&#xff09;。 二、检查点&#xff08;Checkpoint&#xff09; 在流处理中&am…

初识Nacos

前言 Nacos是一个用于微服务架构下的服务发现和配置管理以及服务管理的综合解决方案&#xff08;官网介绍&#xff09;&#xff0c;这里的服务发现其实就是注册中心&#xff0c;配置管理就是配置中心&#xff0c;而服务管理是二者的综合&#xff1b; Nacos特性 1.服务发现与…

《Go语言在微服务中的崛起:为什么Go是下一个后端之星?》

&#x1f337;&#x1f341; 博主猫头虎&#x1f405;&#x1f43e; 带您进入 Golang 语言的新世界✨✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f…

【JavaEE】_CSS常用属性值

目录 1. 字体属性 1.1 设置字体家族 font-family 1.2 设置字体大小 font-size 1.3 设置字体粗细 font-weight 1.4 设置字体倾斜 font-style 2. 文本属性 2.1 设置文本颜色 color 2.2 文本对齐 text-align 2.3 文本装饰 text-decoration 2.4 文本缩进 text-indent 2.…

车载软件架构——基础软件供应商开发工具链(二)

车载软件架构——基础软件供应商&开发工具链(二) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己…

2023-9-10 能被整除的数

题目链接&#xff1a;能被整除的数 #include <iostream> #include <algorithm>using namespace std;typedef long long LL;const int N 20;int n, m; int p[N];int main() {cin >> n >> m;for(int i 0; i < m; i) cin >> p[i];int res 0;f…

性能测试 —— 全链路压测最佳实践!

全链路压测理论基础 什么是全链路压测 基于实际的生产业务场景、系统环境&#xff0c;基于真实数据模拟海量的用户请求对整个业务链进行压力测试&#xff0c;并持续调优的过程&#xff1b; 全链路的核心为&#xff1a;业务场景、数据链路、压力模型和环境拓扑&#xff1b;…

QuantLib学习笔记——看看几何布朗运动有没有股票走势的感觉

⭐️ 小鹿在乱撞 小伙伴们肯定看过股票的走势&#xff0c;真是上蹿下跳啊&#xff0c;最近小编学了一丢丢关于随机过程和QuantLib的知识&#xff0c;想利用随机过程生成一个类似股票价格走势的图&#xff0c;安排&#xff01;&#xff01;&#xff01; ⭐️ 随机过程 随机过程…

基于seata实现分布式事务实现订单服务 + 账户服务 + 商品库存服务之间的分布式事务

概述 实现订单服务 账户服务 商品库存服务之间的分布式事务. 订单服务生成订单,同时调用账户服务扣减金额, 调用库存服务扣减库存. 服务采用seata的刚性事务, 保证数据一致性. 详细 1.需求&#xff08;要做什么&#xff09; 模仿一个购物流程. 利用seata的分布式事务实现 …

【数据结构】栈、队列和数组

栈、队列和数组 栈队列数组数组的顺序表示和实现顺序表中查找和修改数组元素 矩阵的压缩存储特殊矩阵稀疏矩阵 栈 初始化 #define MaxSize 50//栈中元素的最大个数 typedef char ElemType;//数据结构 typedef struct{int top;//栈顶指针ElemType data[MaxSize];//存放栈中的元…