首页 > 其他分享 >【嵌入式开发之标准I/O】二进制文件的读写及实验

【嵌入式开发之标准I/O】二进制文件的读写及实验

时间:2024-07-25 19:59:22浏览次数:12  
标签:fp 文件 二进制 读写 嵌入式 stu age size

文本文件和二进制的区别

文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。‌

  • 编码方式:‌文本文件是基于字符编码的文件,‌常见的编码有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 2
    
    struct students {
    	char name[16];
    	int age;
    	char sex[8];
    	char phone[11];
    }stu[NUM];//定义一个结构体,并声明一个结构体数组stu
    
    int 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

标签:fp,文件,二进制,读写,嵌入式,stu,age,size
From: https://blog.csdn.net/boy_ding_jian/article/details/140575799

相关文章

  • 嵌入式学习--DAY10:函数的调用
    一、函数参数和函数的值1.在定义函数中指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元,只有在发生函数调用时,函数中的形参才会被分配内存单元。在调用结束后,形参所占的内存单元也会被释放。2.实参可以是常量、变量或表达式。在被定义的函数中,必须指定形参的类型,实......
  • 嵌入式工控机和4U工控机的区别
    在现代工业自动化和智能控制领域,工控机(工业计算机)作为关键的硬件支撑,扮演着至关重要的角色。随着技术的进步和市场需求的多样化,工控机的种类和形态不断丰富。其中,嵌入式工控机与4U工控机是两种常见的工业计算机类型。它们在结构、功能、应用场合等方面存在显著的区别。本文将详细......
  • easyexcel的读写操作
    easyexcel是基于java的读写excel的开源项目--读写也可理解为上传和下载写操作一、引入依赖<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency>二、封装相应对象@Data@AllArgsConst......
  • 嵌入式工控机的优势与示例
    嵌入式工控机是一种专用计算系统,旨在在较大的系统或设备中执行特定任务或功能。与通用计算机不同,嵌入式工控机通常集成到日常物品、机械或设备中,例如汽车、电器、医疗设备和工业机器。这些计算机针对效率和可靠性进行了优化,并且通常具有固定用途,运行专用软件来控制和监控设备的操......
  • 《安富莱嵌入式周报》第340期:开源便携RF信号发生器,六自由度3D鼠标,开源USB PD Sniffer,C
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版:https://www.bilibili.com/video/BV18w4m1k7NF/目录1、开源便携RF信号发生器,支持12.5MHz-6.4GHz2、关于ThreadX被移交Eclipse后,使用FileX的exFAT功能版权问题3、......
  • MOTOROLAVME172PA-652SE 嵌入式控制器
    高性能控制:MOTOROLAVME172PA-652SE模块具有高性能的控制能力,可以用于实现复杂的工业自动化系统的控制和监测。多功能模块:该模块可能具备多种功能,如输入/输出控制、数据采集、信号处理等,可适应不同的应用需求。可编程性:MOTOROLAVME172PA-652SE模块通常支持编程和定制化,使......
  • 【UDS诊断协议:ISO-14229中文】【嵌入式车载测试收徒】
    每日直播时间:(直播方式:腾讯会议)周一到周五:20:00-23:00周六与周日:9:00-17:00                 进腾讯会议学习的,可以关注我并后台留言直播内容:(车厂真实项目实操测试)HIL(硬件在环)测试、UDS功能诊断、UDS自动化诊断、数据库制作、DTC故障制造、CAN......
  • 在Python多处理中执行二进制信号量或互斥体以进行上下文切换操作
    我正在尝试自动化win应用程序和java应用程序之间的同步关系。我的标准是:启动win和jav应用程序在jav应用程序中执行命令等待jav应用程序的响应使用jav应用程序的响应到Windows应用程序作为输入。在jav应用程序中执行命令win应用程序......
  • 常见的FTP软件的二进制方式上传图文指导
    常见FTP软件有FlashFXP、CuteFTP、LeapFTP等。不同FTP软件略有差别,用户应结合自身软件情况找到“二进制”处进行设置。英文版的FTP软件,选择设置传输类型为binary(image)。FlashFXP软件进行二进制上传,方法是:点击“会话”——选择“传送模式”——“二进制”即可:CuteFTP软件进行......
  • DASCTF 2023六月挑战赛|二进制专项 PWN (下)
    DASCTF2023六月挑战赛|二进制专项PWN(下)1.can_you_find_me检查保护意料之中64位ida逆向只有add,和del功能不能show先看add吧最多申请10个堆块存在off_by_null漏洞,可以考虑unlink来进行堆块重叠del函数就没有UAF漏洞了1.首先想办法泄露出libc地址,因为本题libc是2.27......