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

FATFS学习笔记——FATFS写文件的两种方式

1.以hex文件直接写:

适用于需要保存比较大的数据时,无需进行格式化处理,直接保存文件

    FIL file;
    FRESULT res;
    UINT bytes_written;
    
    // 创建文件
    res = f_open(&file, "0:/FATFS/TestData.txt", FA_CREATE_ALWAYS | FA_WRITE);
    if (res != FR_OK) {
        printf("Failed to create file\n");
        return 1;
    }
    
    // 待写入的hex数组数据
    uint8_t hex_data[] = {0x12, 0x34, 0x56, 0x78,0x11,0x22,0x33};
    uint32_t data_size = sizeof(hex_data[0]);
    uint32_t data_count = sizeof(hex_data) / sizeof(hex_data[0]);
    
    // 写入数据
    res = f_write(&file, hex_data, data_size, &bytes_written);
    if (res != FR_OK) {
        printf("Failed to write data to file\n");
        f_close(&file);
        return 1;
    }
    
    // 关闭文件
    f_close(&file);
    
    printf("Data written to file successfully\n");

以这种形式写的时候,读的时候往往可以直接读出存储的数据,无需任何数据格式的转换,比如:直接将一个结构体变量数据存到FATFS 文件文本内,需要读取的时候,直接将读取的数据存储到相同的结构体变量内;

2 转化为格式化字符串的形式后再进行存放

//写fatfs 文件--写字符串数据 
  typedef struct 
    {
        U8 Soft_Version[16];//软件版本号
	    U8 Hard_Version[16];
    }MasterDP_t;


  MasterDP_t DP = {"V1.01","V1.01"};
   FIL file;
    FRESULT res;
    UINT bytes_written;
    
    // 创建文件
    res = f_open(&file, "0:/FATFS/TestData.txt", FA_CREATE_ALWAYS | FA_WRITE);
    if (res != FR_OK) {
        printf("Failed to create file\n");
        return 1;
    }
    
    // 待写入的数组buffer
    uint8_t temp_data[256] = {0};
    sprintf(temp_data,"HardVersion:%s,SoftVersion:%s",DP.Hard_Version,DP.Soft_Version);
    // 格式化字符串数据
    res = f_write(&file, temp_data, strlen(temp_data), &bytes_written);
    if (res != FR_OK) {
        printf("Failed to write data to file\n");
        f_close(&file);
        return 1;
    }
    
    // 关闭文件
    f_close(&file);
    
    printf("Data written to file successfully\n");

使用格式化字符串写文件的格式存储数据,读出时,往往需要进行字符串的截取,以上面的片段为例,往往需要先读取出文件的内容,然后查找指定字符子串的起始位置,随后赋值;

fr = f_open(&freadfil, "0:/FATFS/TestData.txt", FA_READ);
       if (0 == fr) 
			{
				mymemset(ReadBuffer,0,sizeof(ReadBuffer));
				 fr = f_read(&freadfil, ReadBuffer, sizeof(ReadBuffer), &br);//获取本地系统参数数据
				if(br != 0)//文件非空
				{
					u8  *ptr_h = (uint8_t*)strstr((const               char*)ReadBuffer,"HardVersion:");//查找"HardVersion:"字符串起始位置
					u8  *ptr_s = (uint8_t*)strstr((const char*)ReadBuffer,",SoftVersion:");

					if(ptr_h != NULL && ptr_s != NULL && ptr_h < ptr_s)
					{
						ptr_h += strlen("HardVersion:");
						u8 HardverLen = ptr_s - ptr_h;
                        if(HardverLen  > sizeof(DP.Hard_Version))
                            HardverLen  = 16;
						for(u32 i = 0;i < HardverLen;i++)
						DP.Hard_Version[i] = *ptr_h++;
						ptr_s += strlen(",SoftVersion:");
						for(u32 i = 0;i < HardverLen;i++)
						 DP.Soft_Version[i] = *ptr_s++;
                    }
                }
       	    f_close(&freadfil);
           }


http://www.kler.cn/a/234539.html

相关文章:

  • JavaSecLab靶场搭建
  • C++算法练习-day40——617.合并二叉树
  • 【机器学习】如何配置anaconda环境(无脑版)
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • 【计算机网络】UDP网络程序
  • Nuxt 版本 2 和 版本 3 的区别
  • 在Ubuntu22.04上部署ComfyUI
  • Java 学习和实践笔记(6)
  • MYSQL分区NOW()不支持
  • MySQL 表的增删查改(练习)
  • 【Spring源码分析】Spring的启动流程源码解析
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • 有哪些方法可以配置并发服务器?
  • 软考 系统分析师系列知识点之信息系统战略规划方法(6)
  • ElementUI鼠标拖动没列宽度
  • C++学习笔记——typedef和using
  • 【机器学习300问】23、什么是主动学习?
  • 基于Java实现Socket文件传输代码详解
  • 算法学习系列(三十二):背包问题
  • 笔记——asp.net core 中的 REST
  • 【iOS操作系统——讲解】
  • leetcode-206-翻转链表
  • 【Jenkins】Jenkins关闭Jenkins关闭、重启
  • LeetCode---383周赛
  • 学了很多知识,没多久就忘光了,怎么办?
  • 力扣刷题之旅:进阶篇(六)—— 图论与最短路径问题