STM32读写TXT文件(可追加数据)的示例代码

来源:互联网 发布:大数据论坛 有哪些 编辑:程序博客网 时间:2024/06/11 15:26
  1. /*
  2. 说明:
  3. *    下面的函数是测试在已有的"大海.txt"文件下继续添加数据
  4. *    测试条件在TF卡中建立"大海.txt"文件,并在文件中添加内容,测试过程中可以分别添加<512数据,=512数据,>512数据进行分别测试
  5. *    作者:Flame
  6. *    测试时间:20130711
  7. */
  8. unsigned int FATFSNumSize;//文件大小存储变量,为了查看方便放到函数外部
  9. void OutPutFile(void)

  10. unsigned int a;
  11. FILINFO finfo;
  12. DIR dirs;
  13. char path[50]={""};                                                            //目录名为空,表示是根目录
  14. //开启长文件名功能时, 要预先初始化文件名缓冲区的长度 
  15. #if _USE_LFN
  16. static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];
  17. finfo.lfname = lfn;
  18. finfo.lfsize = sizeof(lfn);
  19. #endif
  20. USART_OUT(USART1,"\nSTM32开发板文件系统(Tini-FatFS0.08b)启动成功! \n");
  21. disk_initialize(0);    //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号
  22. f_mount(0, &fs);        //将文件系统设置到0区 
  23. if (f_opendir(&dirs, path) == FR_OK)      //读取该磁盘的根目录        
  24. {
  25.    while (f_readdir(&dirs, &finfo) == FR_OK)    //循环依次读取文件名
  26.    {         
  27.       if (finfo.fattrib & AM_ARC)        //判断文件属性是否为存档型      TXT文件一般都为存档型
  28.       {
  29.          if(!finfo.fname[0]) break; //如果是文件名为空表示到目录的末尾。退出         
  30.          if(finfo.lfname[0]){USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);}     //输出长文件名
  31.          else{USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.fname);}       //输出8.3格式文件名                
  32.          if(finfo.lfname[0]){res = f_open(&fsrc, finfo.lfname, FA_OPEN_EXISTING | FA_READ);}//以读的方式打开文件
  33.          else{res = f_open(&fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ); }     //8.3格式文件名 以读的方式打开文件
  34.          FATFSNumSize = f_size(&fsrc);  //读出文件的大小,说明读取文件大小必须在打开文件后才能读出
  35.          br=1;
  36.          for (;;) 
  37.          {                                                                                                                                //循环读出被打开文件的扇区
  38.              for(a=0; a<512; a++) buffer[a]=0;        //因为可以一次读出512字节,先清空数据缓冲区 
  39.              res = f_read(&fsrc, buffer, sizeof(buffer), &br);    //将文件内容读出到数据缓冲区  br存储此次读出数据的数量,最大512
  40.              USART_OUT(USART1,"%s\n",buffer);         //将缓冲区的内容输出到串口1
  41.              if (res || br == 0) break;   // error or eof      //判断是否到文件结束
  42.          }
  43.          f_close(&fsrc);      //关闭源文件
  44.          res1 = f_open(&fdst, "大海.txt", FA_CREATE_ALWAYS | FA_WRITE);          //以写的方式打开"大海.txt"文件
  45.          if(finfo.lfname[0])                
  46.          {
  47.            res = f_open(&fsrc, finfo.lfname, FA_CREATE_ALWAYS | FA_WRITE); //以写的方式打开文件
  48.          } else {
  49.            res = f_open(&fsrc, finfo.fname,  FA_CREATE_ALWAYS | FA_WRITE); //8.3格式文件名 以写的方式打开文件
  50.          }     
  51.          for(a=0; a<512; a++) buffer[a]=0x36;             //往buffer中写入512个6
  52.          f_lseek(&fsrc,FATFSNumSize);                     //偏移到打开文件内容的后面
  53.          //在这里要重点说明的是如果numSize<512将会把数据覆盖,如果numSize>512切numSize%512得到的余数将会覆盖,所有如果numSize不是512的整倍数,要单独做处理
  54.          //我的方法是读取这不到1个扇区的数据,放到缓冲区,然后将512-numSize%512的数据填入缓冲区,写入TF(SD)卡数据,然后再写剩余的数据
  55.          br=512; //写入512个数据
  56.          res1 = f_write(&fsrc, buffer, br, &bw);                                                                                      f_close(&fsrc);//关闭目标文件 本条函数即时保存写入的数据,又是关闭目标文件,如有很多数据要写入,但不需要现在关闭可以调用f_sync函数,但是调用 f_sync前必把S_READONLY == 0可用
  57.      }
  58.    } 
  59.  } 
  60. }

原创粉丝点击